From b5dc9fda0c8efc45a6807745ef0c21da8dce1aaf Mon Sep 17 00:00:00 2001 From: vsv Date: Tue, 13 May 2014 18:14:25 +0400 Subject: [PATCH] Issue #8 : Provide Pop-up menu for windows management --- src/XGUI/XGUI_MainWindow.cpp | 151 +++++++++++++++++++++++++--- src/XGUI/XGUI_MainWindow.h | 11 ++ src/XGUI/XGUI_Viewer.cpp | 15 ++- src/XGUI/XGUI_Viewer.h | 3 + src/XGUI/XGUI_pictures.qrc | 4 + src/XGUI/pictures/cascade_views.png | Bin 0 -> 535 bytes src/XGUI/pictures/new_view.png | Bin 0 -> 940 bytes src/XGUI/pictures/tile_views.png | Bin 0 -> 422 bytes 8 files changed, 165 insertions(+), 19 deletions(-) create mode 100644 src/XGUI/pictures/cascade_views.png create mode 100644 src/XGUI/pictures/new_view.png create mode 100644 src/XGUI/pictures/tile_views.png diff --git a/src/XGUI/XGUI_MainWindow.cpp b/src/XGUI/XGUI_MainWindow.cpp index cbc3e67f3..02971608f 100644 --- a/src/XGUI/XGUI_MainWindow.cpp +++ b/src/XGUI/XGUI_MainWindow.cpp @@ -9,22 +9,10 @@ #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include #include +#include +#include XGUI_MainWindow::XGUI_MainWindow(QWidget* parent) : QMainWindow(parent), @@ -34,9 +22,29 @@ XGUI_MainWindow::XGUI_MainWindow(QWidget* parent) myMenuBar = new XGUI_MainMenu(this); 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())); myViewer = new XGUI_Viewer(this); + connect(myViewer, SIGNAL(viewCreated(XGUI_ViewWindow*)), + this, SLOT(onViewCreated(XGUI_ViewWindow*))); + connect(myViewer, SIGNAL(deleteView(XGUI_ViewWindow*)), + this, SLOT(onViewCreated(XGUI_ViewWindow*))); } XGUI_MainWindow::~XGUI_MainWindow(void) @@ -73,4 +81,117 @@ void XGUI_MainWindow::hidePythonConsole() myPythonConsole->parentWidget()->hide(); } +//****************************************************** +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; + } + 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(); + } + aLastWnd->setFocus(); +} + +void XGUI_MainWindow::onViewCreated(XGUI_ViewWindow* theWindow) +{ + QWidget* aSubWindow = theWindow->parentWidget(); + QWidget* aMDIWidget = centralWidget(); + QAction* aAction; + if (aMDIWidget->actions().size() == 3) { + aAction = new QAction(aMDIWidget); + aAction->setSeparator(true); + aMDIWidget->addAction(aAction); + } + aAction = new QAction(aSubWindow->windowTitle(), aMDIWidget); + aAction->setCheckable(true); + connect(aAction, SIGNAL(triggered(bool)), this, SLOT(activateView())); + aMDIWidget->addAction(aAction); + + QList aActions = aMDIWidget->actions(); + foreach(QAction* aAct, aActions) { + if (aAct->isCheckable()) + aAct->setChecked(false); + } + aAction->setChecked(true); +} + +void XGUI_MainWindow::onDeleteView(XGUI_ViewWindow* theWindow) +{ + QWidget* aSubWindow = theWindow->parentWidget(); + QString aTitle = aSubWindow->windowTitle(); + QWidget* aMDIWidget = centralWidget(); + QList aActions = aMDIWidget->actions(); + + 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(); + foreach(QMdiSubWindow* aWnd, aWndList) { + if (aWnd->windowTitle() == aWndTitle) { + aWnd->raise(); + aWnd->activateWindow(); + aWnd->setFocus(); + break; + } + } + QApplication::processEvents(); +} + +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); + } +} \ No newline at end of file diff --git a/src/XGUI/XGUI_MainWindow.h b/src/XGUI/XGUI_MainWindow.h index 17357858d..9b29ec3ea 100644 --- a/src/XGUI/XGUI_MainWindow.h +++ b/src/XGUI/XGUI_MainWindow.h @@ -7,7 +7,9 @@ class XGUI_MainMenu; class XGUI_Viewer; class XGUI_ActionsMgr; +class XGUI_ViewWindow; class QMdiArea; +class QMdiSubWindow; class PyConsole_EnhConsole; /**\class XGUI_MainWindow @@ -42,6 +44,15 @@ public slots: void showPythonConsole(); void hidePythonConsole(); + void createSubWindow(); + +private slots: + void cascadeWindows(); + void onViewCreated(XGUI_ViewWindow* theWindow); + void onDeleteView(XGUI_ViewWindow* theWindow); + void activateView(); + void onViewActivated(QMdiSubWindow* theSubWnd); + private: XGUI_MainMenu* myMenuBar; XGUI_Viewer* myViewer; diff --git a/src/XGUI/XGUI_Viewer.cpp b/src/XGUI/XGUI_Viewer.cpp index 6fae264d2..12eae6e4a 100644 --- a/src/XGUI/XGUI_Viewer.cpp +++ b/src/XGUI/XGUI_Viewer.cpp @@ -89,7 +89,8 @@ XGUI_Viewer::XGUI_Viewer(XGUI_MainWindow* theParent, bool DisplayTrihedron) myIsRelative(true), myInteractionStyle(XGUI::STANDARD), myTrihedronSize(100), - myActiveView(0) + myActiveView(0), + myWndIdCount(0) { if (!isInitialized) { isInitialized = true; @@ -185,9 +186,11 @@ QMdiSubWindow* XGUI_Viewer::createView(V3d_TypeOfView theType) QMdiArea* aMDI = myMainWindow->mdiArea(); QMdiSubWindow* aWnd = aMDI->addSubWindow(view, Qt::FramelessWindowHint); - addView(aWnd); + addView(aWnd); aWnd->setGeometry(0, 0, aMDI->width() / 2, aMDI->height() / 2); aWnd->show(); + aWnd->setWindowTitle(QString("Viewer #%1").arg(++myWndIdCount)); + emit viewCreated(view); return aWnd; } @@ -440,8 +443,11 @@ void XGUI_Viewer::addView(QMdiSubWindow* theView) connect(aWindow, SIGNAL(keyReleased(XGUI_ViewWindow*, QKeyEvent*)), this, SIGNAL(keyRelease(XGUI_ViewWindow*, QKeyEvent*))); -// connect(aWindow, SIGNAL(contextMenuRequested( QContextMenuEvent* )), -// this, SLOT (onContextMenuRequested( QContextMenuEvent* ))); + //connect(aWindow, SIGNAL(contextMenuRequested( QContextMenuEvent* )), + // this, SLOT (onContextMenuRequested( QContextMenuEvent* ))); + //connect(aWindow, SIGNAL( contextMenuRequested(QContextMenuEvent*) ), + // this, SIGNAL( contextMenuRequested(QContextMenuEvent*) ) ); + connect(aWindow, SIGNAL(mouseMoving(XGUI_ViewWindow*, QMouseEvent*)), this, SLOT(onMouseMove(XGUI_ViewWindow*, QMouseEvent*))); @@ -457,6 +463,7 @@ void XGUI_Viewer::addView(QMdiSubWindow* theView) void XGUI_Viewer::onWindowActivated(QMdiSubWindow* view) { if (view && (view != myActiveView) && (!view->isMinimized())) { + qDebug("onWindowActivated"); myActiveView = view; ((XGUI_ViewWindow*)myActiveView->widget())->windowActivated(); QList::iterator aIt; diff --git a/src/XGUI/XGUI_Viewer.h b/src/XGUI/XGUI_Viewer.h index 4031430a3..1eb2bd47e 100644 --- a/src/XGUI/XGUI_Viewer.h +++ b/src/XGUI/XGUI_Viewer.h @@ -191,6 +191,9 @@ private: /// Points used for selection management QPoint myStartPnt, myEndPnt, myCurPnt; + + // A counter of created windows + int myWndIdCount; }; #endif diff --git a/src/XGUI/XGUI_pictures.qrc b/src/XGUI/XGUI_pictures.qrc index 399af8230..1efefb080 100644 --- a/src/XGUI/XGUI_pictures.qrc +++ b/src/XGUI/XGUI_pictures.qrc @@ -48,5 +48,9 @@ pictures/button_cancel.png pictures/button_help.png pictures/button_ok.png + + pictures/cascade_views.png + pictures/tile_views.png + pictures/new_view.png diff --git a/src/XGUI/pictures/cascade_views.png b/src/XGUI/pictures/cascade_views.png new file mode 100644 index 0000000000000000000000000000000000000000..db4511144eb0c2b27a29dc9384d53844494cef52 GIT binary patch literal 535 zcmV+y0_gpTP)2T?Dsw(ZNx0Q=CPR>LM;8{u?eT7DUiRClSF>2RG-UwzMH6z4Kk#w3R06 zgK){+z3+bSeHWH2UR}ln&nqbW7MwBEU0F)U%tH6P(8&jdSxCyKJ)yy9L2!nhi-){a z$`@-3G?c_}ybo)qPjH=TxPT_$943j-IjWmPG$b&R=!b1raI&({K9Pl%K?w%`K_WbQ znHv*u8w!@-*gSuR=hh;7Vdx|hp^}yD$&!$=xj^~&v>iB34adv#G^4;GWf%++*}Z(s zi}oBTY|M^g>r5gOGqHX9PK`s4i1x~(LywlmX_V*)sHTmQgs4H7$_x^2uQPg^rcDo+ zB%mOAtfQ_jPQ>WR;;(RtL}+VT-RUq=yuQ3ZMO+L<7}GN|&`t=iR=FSAzs~iUM#ppt zE18UJBkQ`gqI$HtPGc&yclFdXoBP9HA`TfLzykpqME3CJO@Drr%RY(GB1u`6->fhj zf@*bzBA^aPtYVAA5HS8|qDgmw5y20SiR6yOlR1~%kSglWY$mIEq zd1wa9lmjj$O1n-dMW!h0xyZ1#>WJL^Dc`~ED0nAj>e5HqPqVc4^HD-C^K(U#nyw_JVM?A(oBgHn44{KIC_?)>&DI5^z-r|2fdZM zDk^zwmv{0@EK2pZ-|(fnukO5H`vrd0K$Xs9M+wep?>_x}GwI>d^`=HHPuJVCF63}v z`E!59-m>1tQwa z?ULr9Y@;RZ{MagRTIDQ}?T6BCLW_IzCA00=3$kqHe{Fb}#@X2?=agoL9 zOHVD&oFsix8|%6MtQOtr_ZQ4u^Wo~JO1*WzcP|R_wDQfa_Abbd=Dzn%?be}d zk1j8<|I_pDtJ2e_f{CAWH=bL#U%)$fd1h3ItiY+g<^m4<8DZxqte>}VV}jk?12yJp zUrzky*>-Pn?0<%fuYU>!r<*Ttsqafre>)>h)HBT3&r8koq{-Shy@kow)P#51S;f}Y zJxq&S9elNESJcm{^fy2EwzfWPkFVjqeeuew6{ojkq?Kl_in(}BWLwya$ii=or5`?( zTF(hnW4+#Z-O>Cv`&^y%-$Huo(txR5wZt`|BqgyV)hf9t6-Y4{85kPq8W`ys8iW`a zS{a#G834IvK=PZ%yCxJ3x%nxXX_Y_?2FALEhPp=PA%><_riNCgCJ+tD?gdYP8W=oX L{an^LB{Ts5v|FYf literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/tile_views.png b/src/XGUI/pictures/tile_views.png new file mode 100644 index 0000000000000000000000000000000000000000..fd9fece1221534dea9d3fc6709f0398611f044b6 GIT binary patch literal 422 zcmV;X0a^ZuP)htDI%U@pu01-?@m5{AQFX z*|*NYHy^?`A)o|M@RVyY$?UVRC13R#Y&i#?|pA>6LkhUH~2Y8M=*S#ttS1Q(J-YnK#j1dP$J z!KV!B%P^|niP&eDl!#85X0@I+)ZDBTQBIQ0EwIn7!ie$368sgnjOll?Z zS1iLwe7xUx^2y|aIrT(z QOaK4?07*qoM6N<$g3@}odH?_b literal 0 HcmV?d00001 -- 2.39.2