X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=inline;f=src%2FXGUI%2FXGUI_MainWindow.cpp;h=7fc26f0bfb5f8fb38556a89734e28a7b2f32cdec;hb=19bc85698899d6bee8704e7b0953ee045b0eb66f;hp=3c4e99b49d3dd5caea59bbf1a34e48150f6cae46;hpb=f09c9895be486d30c9aa48da040c3aeb3ccbaa74;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_MainWindow.cpp b/src/XGUI/XGUI_MainWindow.cpp index 3c4e99b49..7fc26f0bf 100644 --- a/src/XGUI/XGUI_MainWindow.cpp +++ b/src/XGUI/XGUI_MainWindow.cpp @@ -1,155 +1,296 @@ #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 +#include #include -#include -#include -#include #include -#include -#include -#include #include -#include - -XGUI_MainWindow::XGUI_MainWindow(QWidget* parent) : - QMainWindow(parent), myObjectBrowser(0) -{ - //menuBar(); - 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(20); - aDoc->setWindowTitle("Console"); - QTextEdit* aTextEdt = new QTextEdit(aDoc); - aTextEdt->setText(">>>"); - aTextEdt->setMinimumHeight(20); - aDoc->setWidget(aTextEdt); - addDockWidget(Qt::BottomDockWidgetArea, aDoc); - - QMdiArea* aMdiArea = new QMdiArea(this); - setCentralWidget(aMdiArea); - - aMdiArea->addSubWindow(getSubWindow(), Qt::FramelessWindowHint); - - fillObjectBrowser(); - -} - - -QWidget* XGUI_MainWindow::getSubWindow() -{ - QMdiSubWindow* aSub = new QMdiSubWindow(this); - QLabel* aLbl = new QLabel(aSub); - aLbl->setFrameStyle(QFrame::Sunken); - aLbl->setFrameShape(QFrame::Panel); - aLbl->setPixmap(QPixmap(":pictures/ViewPort.png")); - aLbl->setScaledContents(true); - aSub->setWidget(aLbl); - - QStringList aPictures; - aPictures<<":pictures/occ_view_camera_dump.png"<<":pictures/occ_view_style_switch.png"; - aPictures<<":pictures/occ_view_triedre.png"<<":pictures/occ_view_fitall.png"; - aPictures<<":pictures/occ_view_fitarea.png"<<":pictures/occ_view_zoom.png"; - aPictures<<":pictures/occ_view_pan.png"<<":pictures/occ_view_glpan.png"; - aPictures<<":pictures/occ_view_rotate.png"<<":pictures/occ_view_front.png"; - aPictures<<":pictures/occ_view_back.png"<<":pictures/occ_view_left.png"; - aPictures<<":pictures/occ_view_right.png"<<":pictures/occ_view_top.png"; - aPictures<<":pictures/occ_view_bottom.png"<<":pictures/occ_view_clone.png"; - - QToolBar* aBar = new QToolBar(aSub); - aBar->setGeometry(0,0,500,30); - - QAction* aBtn; - foreach(QString aName, aPictures) { - aBtn = new QAction(aBar); - aBtn->setIcon(QIcon(aName)); - aBar->addAction(aBtn); - } - - aBar = new QToolBar(aSub); - aBar->setGeometry(615,0,100,25); - QStringList aWndIcons; - aWndIcons<<":pictures/wnd_minimize.png"<<":pictures/wnd_maximize.png"<<":pictures/wnd_close.png"; - foreach(QString aName, aWndIcons) { - aBtn = new QAction(aBar); - aBtn->setIcon(QIcon(aName)); - aBar->addAction(aBtn); - } +#include +#include +#include +#include - return aSub; -} +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) { } //****************************************************** -void XGUI_MainWindow::showObjectBrowser() +QMdiArea* XGUI_MainWindow::mdiArea() const +{ + return static_cast(centralWidget()); +} + +//****************************************************** +void XGUI_MainWindow::showPythonConsole() { - myObjectBrowser->parentWidget()->show(); + // 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::hideObjectBrowser() +void XGUI_MainWindow::hidePythonConsole() { - myObjectBrowser->parentWidget()->hide(); + if (myPythonConsole) + myPythonConsole->parentWidget()->hide(); } //****************************************************** -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 aItems; - foreach(QString aName, aNames) { - QTreeWidgetItem* aItem = new QTreeWidgetItem(myObjectBrowser); - aItem->setText(0, aName); - aItems.append(aItem); +void XGUI_MainWindow::dockPythonConsole() +{ + 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(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::createSubWindow() +{ + viewer()->createView(); +} + +//****************************************************** +void XGUI_MainWindow::cascadeWindows() +{ + QMdiArea* aMdiArea = static_cast(centralWidget()); + QList 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); + aWnd->setGeometry(QStyle::visualRect(aWnd->layoutDirection(), aRect, QRect(x, y, w, h))); + i++; + j++; + viewer()->onWindowActivated(aWnd); + aLastWnd = aWnd; + QApplication::processEvents(); + } + aLastWnd->setFocus(); +} + +void XGUI_MainWindow::onViewCreated(XGUI_ViewWindow* theWindow) +{ + QWidget* aSubWindow = theWindow->parentWidget(); + QWidget* aMDIWidget = centralWidget(); - 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")); + QAction* aAction = new QAction(aSubWindow->windowTitle(), aMDIWidget); + aAction->setCheckable(true); + connect(aAction, SIGNAL(triggered(bool)), this, SLOT(activateView())); + aMDIWidget->addAction(aAction); - aItem = new QTreeWidgetItem(aItems[i]); - aItem->setText(0, "Construction"); - aItem->setIcon(0, QIcon(":pictures/constr_folder.png")); + QList 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 aActions = aMDIWidget->actions(); - aItem = new QTreeWidgetItem(aItems[i]); - aItem->setText(0, "Features"); - aItem->setIcon(0, QIcon(":pictures/features.png")); + QAction* aDelAct = 0; + foreach(QAction* aAct, aActions) + { + if (aAct->text() == aTitle) { + aDelAct = aAct; + break; } + } + aMDIWidget->removeAction(aDelAct); } + +void XGUI_MainWindow::activateView() +{ + QAction* aAction = static_cast(sender()); + QString aWndTitle = aAction->text(); + QMdiArea* aMdiArea = static_cast(centralWidget()); + + QList 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(centralWidget()); + QString aWndTitle = theSubWnd->windowTitle(); + QList 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); + } +} +