diff options
Diffstat (limited to 'src-qt5/core/libLumina')
-rw-r--r-- | src-qt5/core/libLumina/LuminaUtils.cpp | 4 | ||||
-rw-r--r-- | src-qt5/core/libLumina/LuminaUtils.h | 4 | ||||
-rw-r--r-- | src-qt5/core/libLumina/ResizeMenu.cpp | 106 | ||||
-rw-r--r-- | src-qt5/core/libLumina/ResizeMenu.h | 51 | ||||
-rw-r--r-- | src-qt5/core/libLumina/ResizeMenu.pri | 6 |
5 files changed, 167 insertions, 4 deletions
diff --git a/src-qt5/core/libLumina/LuminaUtils.cpp b/src-qt5/core/libLumina/LuminaUtils.cpp index 0fb44ff1..0d808d1d 100644 --- a/src-qt5/core/libLumina/LuminaUtils.cpp +++ b/src-qt5/core/libLumina/LuminaUtils.cpp @@ -966,7 +966,7 @@ int LUtils::VersionStringToNumber(QString version){ // ======================= // RESIZEMENU CLASS // ======================= -ResizeMenu::ResizeMenu(QWidget *parent) : QMenu(parent){ +/*ResizeMenu::ResizeMenu(QWidget *parent) : QMenu(parent){ this->setContentsMargins(1,1,1,1); this->setMouseTracking(true); resizeSide = NONE; @@ -1060,4 +1060,4 @@ void ResizeMenu::mouseReleaseEvent(QMouseEvent *ev){ }else{ QMenu::mouseReleaseEvent(ev); //do normal processing } -} +}*/ diff --git a/src-qt5/core/libLumina/LuminaUtils.h b/src-qt5/core/libLumina/LuminaUtils.h index e07363ca..4a0a19af 100644 --- a/src-qt5/core/libLumina/LuminaUtils.h +++ b/src-qt5/core/libLumina/LuminaUtils.h @@ -99,7 +99,7 @@ public: //Special subclass for a menu which the user can grab the edges and resize as necessary // Note: Make sure that you don't set 0pixel contents margins on this menu // - it needs at least 1 pixel margins for the user to be able to grab it -class ResizeMenu : public QMenu{ +/*class ResizeMenu : public QMenu{ Q_OBJECT public: ResizeMenu(QWidget *parent = 0); @@ -126,6 +126,6 @@ protected: signals: void MenuResized(QSize); //Emitted when the menu is manually resized by the user -}; +};*/ #endif diff --git a/src-qt5/core/libLumina/ResizeMenu.cpp b/src-qt5/core/libLumina/ResizeMenu.cpp new file mode 100644 index 00000000..9f291134 --- /dev/null +++ b/src-qt5/core/libLumina/ResizeMenu.cpp @@ -0,0 +1,106 @@ +//=========================================== +// Lumina-DE source code +// Copyright (c) 2013-2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "ResizeMenu.h" + +// ======================= +// RESIZEMENU CLASS +// ======================= +ResizeMenu::ResizeMenu(QWidget *parent) : QMenu(parent){ + this->setContentsMargins(1,1,1,1); + this->setMouseTracking(true); + resizeSide = NONE; + cAct = new QWidgetAction(this); + contents = 0; + connect(this, SIGNAL(aboutToShow()), this, SLOT(clearFlags()) ); + connect(this, SIGNAL(aboutToHide()), this, SLOT(clearFlags()) ); + connect(cAct, SIGNAL(hovered()), this, SLOT(clearFlags()) ); +} + +ResizeMenu::~ResizeMenu(){ + +} + +void ResizeMenu::setContents(QWidget *con){ + this->clear(); + cAct->setDefaultWidget(con); + this->addAction(cAct); + contents = con; //save for later + contents->setCursor(Qt::ArrowCursor); +} + +void ResizeMenu::mouseMoveEvent(QMouseEvent *ev){ + QRect geom = this->geometry(); + //Note: The exact position does not matter as much as the size + // since the window will be moved again the next time it is shown + // The "-2" in the sizing below accounts for the menu margins + QPoint gpos = this->mapToGlobal(ev->pos()); + bool handled = false; + switch(resizeSide){ + case TOP: + if(gpos.y() >= geom.bottom()-1){ break; } + geom.setTop(gpos.y()); + this->setGeometry(geom); + if(contents!=0){ contents->setFixedSize(QSize(geom.width()-2, geom.height()-2));} + handled = true; + break; + case BOTTOM: + if(gpos.y() <= geom.top()+1){ break; } + geom.setBottom( gpos.y()); + this->setGeometry(geom); + if(contents!=0){ contents->setFixedSize(QSize(geom.width()-2, geom.height()-2));} + handled = true; + break; + case LEFT: + if(gpos.x() >= geom.right()-1){ break; } + geom.setLeft(gpos.x()); + this->setGeometry(geom); + if(contents!=0){ contents->setFixedSize(QSize(geom.width()-2, geom.height()-2));} + handled = true; + break; + case RIGHT: + if(gpos.x() <= geom.left()+1){ break; } + geom.setRight(gpos.x()); + this->setGeometry(geom); + if(contents!=0){ contents->setFixedSize(QSize(geom.width()-2, geom.height()-2));} + handled = true; + break; + default: //NONE + //qDebug() << " - Mouse At:" << ev->pos(); + //Just adjust the mouse cursor which is shown + if(ev->pos().x()<=1 && ev->pos().x() >= -1){ this->setCursor(Qt::SizeHorCursor); } + else if(ev->pos().x() >= this->width()-1 && ev->pos().x() <= this->width()+1){ this->setCursor(Qt::SizeHorCursor); } + else if(ev->pos().y()<=1 && ev->pos().y() >= -1){ this->setCursor(Qt::SizeVerCursor); } + else if(ev->pos().y() >= this->height()-1 && ev->pos().y() <= this->height()+1){ this->setCursor(Qt::SizeVerCursor); } + else{ this->setCursor(Qt::ArrowCursor); } + } + if(!handled){ QMenu::mouseMoveEvent(ev); } //do normal processing as well +} + +void ResizeMenu::mousePressEvent(QMouseEvent *ev){ + bool used = false; + if(ev->buttons().testFlag(Qt::LeftButton) && resizeSide==NONE){ + //qDebug() << "Mouse Press Event:" << ev->pos() << resizeSide; + if(ev->pos().x()<=1 && ev->pos().x() >= -1){resizeSide = LEFT; used = true;} + else if(ev->pos().x() >= this->width()-1 && ev->pos().x() <= this->width()+1){ resizeSide = RIGHT; used = true;} + else if(ev->pos().y()<=1 && ev->pos().y() >= -1){ resizeSide = TOP; used = true; } + else if(ev->pos().y() >= this->height()-1 && ev->pos().y() <= this->height()+1){ resizeSide = BOTTOM; used = true; } + } + if(used){ ev->accept(); this->grabMouse(); } + else{ QMenu::mousePressEvent(ev); } //do normal processing +} + +void ResizeMenu::mouseReleaseEvent(QMouseEvent *ev){ + this->releaseMouse(); + if(ev->button() == Qt::LeftButton && resizeSide!=NONE ){ + //qDebug() << "Mouse Release Event:" << ev->pos() << resizeSide; + resizeSide = NONE; + emit MenuResized(contents->size()); + ev->accept(); + }else{ + QMenu::mouseReleaseEvent(ev); //do normal processing + } +} diff --git a/src-qt5/core/libLumina/ResizeMenu.h b/src-qt5/core/libLumina/ResizeMenu.h new file mode 100644 index 00000000..ed909da3 --- /dev/null +++ b/src-qt5/core/libLumina/ResizeMenu.h @@ -0,0 +1,51 @@ +//=========================================== +// Lumina-DE source code +// Copyright (c) 2012-2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#ifndef _LUMINA_LIBRARY_RESIZE_MENU_H +#define _LUMINA_LIBRARY_RESIZE_MENU_H + +#include <QMenu> +#include <QWidget> +#include <QMouseEvent> +#include <QAction> +#include <QWidgetAction> +#include <QRect> +#include <QCursor> +#include <QPoint> + +//Special subclass for a menu which the user can grab the edges and resize as necessary +// Note: Make sure that you don't set 0pixel contents margins on this menu +// - it needs at least 1 pixel margins for the user to be able to grab it +class ResizeMenu : public QMenu{ + Q_OBJECT +public: + ResizeMenu(QWidget *parent = 0); + virtual ~ResizeMenu(); + + void setContents(QWidget *con); + +private: + enum SideFlag{NONE, TOP, BOTTOM, LEFT, RIGHT}; + SideFlag resizeSide; + QWidget *contents; + QWidgetAction *cAct; + +private slots: + void clearFlags(){ + resizeSide=NONE; + } + +protected: + virtual void mouseMoveEvent(QMouseEvent *ev); + virtual void mousePressEvent(QMouseEvent *ev); + virtual void mouseReleaseEvent(QMouseEvent *ev); + +signals: + void MenuResized(QSize); //Emitted when the menu is manually resized by the user + +}; + +#endif diff --git a/src-qt5/core/libLumina/ResizeMenu.pri b/src-qt5/core/libLumina/ResizeMenu.pri new file mode 100644 index 00000000..2b055841 --- /dev/null +++ b/src-qt5/core/libLumina/ResizeMenu.pri @@ -0,0 +1,6 @@ +#Subproject file for bundling the ResizeMenu class into an application +SOURCES += $${PWD}/ResizeMenu.cpp +HEADERS += $${PWD}/ResizeMenu.h +#Add this dir to the include path +# This allows the application to simply use "#include <ResizeMenu.h>" to use it +INCLUDEPATH *= $${PWD} |