#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>
+#include <QApplication>
+#include <QTimer>
+#include <QCloseEvent>
+
XGUI_MainWindow::XGUI_MainWindow(QWidget* parent)
- : QMainWindow(parent),
- myObjectBrowser(0),
- myPythonConsole(0)
+ : QMainWindow(parent),
+ myPythonConsole(0), myIsModified(false)
{
- setWindowTitle(tr("WINDOW_TITLE"));
- 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();
-
+ 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*)));
- myViewer = new XGUI_Viewer(this);
+ // 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);
- //fillObjectBrowser();
- //addPropertyPanel();
+ 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)
return static_cast<QMdiArea*>(centralWidget());
}
-//******************************************************
-void XGUI_MainWindow::showObjectBrowser()
-{
- myObjectBrowser->parentWidget()->show();
-}
-
-//******************************************************
-void XGUI_MainWindow::hideObjectBrowser()
-{
- myObjectBrowser->parentWidget()->hide();
-}
-
//******************************************************
void XGUI_MainWindow::showPythonConsole()
{
+ // TODO: Check why PyConsole can not be created
if (!myPythonConsole) {
-
- QDockWidget* aDoc = new QDockWidget(this);
- aDoc->setFeatures(QDockWidget::AllDockWidgetFeatures | QDockWidget::DockWidgetVerticalTitleBar);
- aDoc->setMinimumHeight(0);
- aDoc->setWindowTitle("Console");
- myPythonConsole = new PyConsole_EnhConsole( aDoc, new PyConsole_EnhInterp());
- //myPythonConsole = new QTextEdit(aDoc);
- //myPythonConsole->setGeometry(0,0,200, 50);
- //myPythonConsole->setText(">>>");
- aDoc->setWidget(myPythonConsole);
- //myPythonConsole->setMinimumHeight(0);
- addDockWidget(Qt::TopDockWidgetArea, aDoc);
- tabifyDockWidget(myMenuBar->getLastDockWindow(), aDoc);
+ myPythonConsole = new PyConsole_EnhConsole(this, new PyConsole_EnhInterp());
+ myPythonConsole->setObjectName("PythonConsole");
+ undockPythonConsole();
}
myPythonConsole->parentWidget()->show();
}
myPythonConsole->parentWidget()->hide();
}
+//******************************************************
+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<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);
+}
//******************************************************
-
-// TEST FUNCTIONS
+void XGUI_MainWindow::createSubWindow()
+{
+ 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)
+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)
{
- QTreeWidgetItem* aItem = new QTreeWidgetItem(myObjectBrowser);
- aItem->setText(0, aName);
- aItems.append(aItem);
+ aWnd->showNormal();
+ aWnd->raise();
+ x = aOffset * i;
+ if ((x + w) > aSize.width()) {
+ x = 0;
+ i = 0;
+ }
+ y = aOffset * j;
+ if ((y + h) > aSize.height()) {
+ y = 0;
+ j = 0;
+ }
+ aWnd->setGeometry(QStyle::visualRect(aWnd->layoutDirection(), aRect, QRect(x, y, w, h)));
+ i++;
+ j++;
+ viewer()->onWindowActivated(aWnd);
+ aLastWnd = aWnd;
+ QApplication::processEvents();
}
- for(int i = 0; i < aItems.length(); i++) {
- aItems[i]->setIcon(0, QIcon(aIcons[i]));
- }
- 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"));
+ 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();
- aItem = new QTreeWidgetItem(aItems[i]);
- aItem->setText(0, "Bodies");
- aItem->setIcon(0, QIcon(":pictures/part_ico.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, "Features");
- aItem->setIcon(0, QIcon(":pictures/features.png"));
+ QList<QAction*> aActions = aMDIWidget->actions();
+ foreach(QAction* aAct, aActions)
+ {
+ if (aAct->isCheckable())
+ aAct->setChecked(false);
}
+ aAction->setChecked(true);
}
-void XGUI_MainWindow::addPropertyPanel()
+void XGUI_MainWindow::onDeleteView(XGUI_ViewWindow* theWindow)
{
- 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));*/
+ QWidget* aSubWindow = theWindow->parentWidget();
+ QString aTitle = aSubWindow->windowTitle();
+ QWidget* aMDIWidget = centralWidget();
+ QList<QAction*> aActions = aMDIWidget->actions();
- 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);
+ QAction* aDelAct = 0;
+ foreach(QAction* aAct, aActions)
+ {
+ if (aAct->text() == aTitle) {
+ aDelAct = aAct;
+ break;
+ }
+ }
+ aMDIWidget->removeAction(aDelAct);
+}
- QLabel* aLbl = new QLabel(aGrpBox1);
- aLbl->setPixmap(QPixmap(":pictures/x_point.png"));
- aFrmLay->addRow(aLbl, new QDoubleSpinBox(aGrpBox1));
+void XGUI_MainWindow::activateView()
+{
+ QAction* aAction = static_cast<QAction*>(sender());
+ QString aWndTitle = aAction->text();
+ QMdiArea* aMdiArea = static_cast<QMdiArea*>(centralWidget());
- aLbl = new QLabel(aGrpBox1);
- aLbl->setPixmap(QPixmap(":pictures/y_point.png"));
- aFrmLay->addRow(aLbl, new QDoubleSpinBox(aGrpBox1));
+ 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()));
+}
- aLbl = new QLabel(aGrpBox1);
- aLbl->setPixmap(QPixmap(":pictures/z_point.png"));
- aFrmLay->addRow(aLbl, new QDoubleSpinBox(aGrpBox1));
+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);
+ }
+}
- /* aGrpBox1 = new QGroupBox("Normal vector", aContent);
- aGrpBox1->setFlat(true);
- aFrmLay = new QFormLayout(aGrpBox1);
- aFrmLay->setContentsMargins(0, 6, 0, 0);
- aMainLay->addWidget(aGrpBox1);
+void XGUI_MainWindow::closeEvent(QCloseEvent * event)
+{
+ emit exitKeySequence();
+ event->ignore();
+}
- aLbl = new QLabel(aGrpBox1);
- aLbl->setPixmap(QPixmap(":pictures/x_size.png"));
- aFrmLay->addRow(aLbl, new QDoubleSpinBox(aGrpBox1));
+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);
+}
- 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));*/
+void XGUI_MainWindow::updateTitle()
+{
+ QString aTitle = myTitle;
+ if (!myCurrentDir.isNull())
+ aTitle += " - " + myCurrentDir;
+ if (myIsModified)
+ aTitle += "*";
+ setWindowTitle(aTitle);
+}
- aMainLay->addStretch(1);
+void XGUI_MainWindow::setCurrentDir(const QString& theDir, bool toUpdate)
+{
+ myCurrentDir = theDir;
+ if (toUpdate)
+ updateTitle();
+}
- 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);
+void XGUI_MainWindow::setModifiedState(bool isModified, bool toUpdate)
+{
+ myIsModified = isModified;
+ if (toUpdate)
+ updateTitle();
+}
- 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);
+CloseEventWatcher::CloseEventWatcher(QObject* theParent)
+ : QObject(theParent)
+{
+}
- addDockWidget(Qt::RightDockWidgetArea, aPropPanel);
+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);
+ }
}
+