diff --git a/DSView/pv/dialogs/calibration.h b/DSView/pv/dialogs/calibration.h index 02149405..3a9bbfd3 100644 --- a/DSView/pv/dialogs/calibration.h +++ b/DSView/pv/dialogs/calibration.h @@ -29,6 +29,7 @@ #include #include #include +#include #include "../toolbars/titlebar.h" #include "dsdialog.h" #include "../ui/uimanager.h" diff --git a/DSView/pv/toolbars/titlebar.cpp b/DSView/pv/toolbars/titlebar.cpp index 5a05e59e..79ef01b5 100644 --- a/DSView/pv/toolbars/titlebar.cpp +++ b/DSView/pv/toolbars/titlebar.cpp @@ -70,9 +70,9 @@ TitleBar::TitleBar(bool top, QWidget *parent, ITitleParent *titleParent, bool ha lay1->addWidget(_title); if (_isTop) { - _minimizeButton = new XToolButton(this); + _minimizeButton = new QToolButton(this); _minimizeButton->setObjectName("MinimizeButton"); - _maximizeButton = new XToolButton(this); + _maximizeButton = new QToolButton(this); _maximizeButton->setObjectName("MaximizeButton"); lay1->addWidget(_minimizeButton); @@ -85,7 +85,7 @@ TitleBar::TitleBar(bool top, QWidget *parent, ITitleParent *titleParent, bool ha } if (_isTop || _hasClose) { - _closeButton= new XToolButton(this); + _closeButton= new QToolButton(this); _closeButton->setObjectName("CloseButton"); lay1->addWidget(_closeButton); connect(_closeButton, SIGNAL( clicked()), parent, SLOT(close())); diff --git a/DSView/pv/toolbars/titlebar.h b/DSView/pv/toolbars/titlebar.h index 7aa79225..25548e1d 100644 --- a/DSView/pv/toolbars/titlebar.h +++ b/DSView/pv/toolbars/titlebar.h @@ -23,9 +23,9 @@ #define DSVIEW_PV_TOOLBARS_TITLEBAR_H #include +#include #include "../interface/icallbacks.h" -#include "../ui/xtoolbutton.h" #include "../ui/uimanager.h" @@ -94,9 +94,9 @@ protected: void mouseDoubleClickEvent(QMouseEvent *event); - XToolButton *_minimizeButton; - XToolButton *_maximizeButton; - XToolButton *_closeButton; + QToolButton *_minimizeButton; + QToolButton *_maximizeButton; + QToolButton *_closeButton; QLabel *_title; bool _moving; diff --git a/DSView/pv/ui/xtoolbutton.cpp b/DSView/pv/ui/xtoolbutton.cpp index 837ba10a..7c0e9189 100644 --- a/DSView/pv/ui/xtoolbutton.cpp +++ b/DSView/pv/ui/xtoolbutton.cpp @@ -21,29 +21,92 @@ #include "xtoolbutton.h" #include -#include "../log.h" +#include +#include "../log.h" +namespace +{ + static int _click_times = 0; + static XToolButton *_lst_button = NULL; +} XToolButton::XToolButton(QWidget *parent) :QToolButton(parent) { - + _menu = NULL; + _is_mouse_down = false; } void XToolButton::mousePressEvent(QMouseEvent *event) { - -#ifdef _WIN32 - if (event->button() == Qt::LeftButton) - { - QMenu* menu = this->menu(); - if (menu){ - QPoint pt = mapToGlobal(rect().bottomLeft()); - menu->popup(pt); - return; - } - } -#endif + _is_mouse_down = true; + if (_lst_button != this){ + _click_times = 0; + } + + _lst_button = this; + +#ifdef _WIN32 + _menu = this->menu(); + if (_menu == NULL){ + QToolButton::mousePressEvent(event); // is not a popup menu. + return; + } + + _click_times++; + + if (event->button() != Qt::LeftButton){ + setCheckable(true); + setChecked(false); + setCheckable(false); + return; + } + + if (_click_times % 2 == 1){ + setCheckable(true); + setChecked(true); + QPoint pt = mapToGlobal(rect().bottomLeft()); + connect(_menu, SIGNAL(aboutToHide()), this, SLOT(onHidePopupMenu())); + _menu->popup(pt); + } + else{ + setCheckable(true); + setChecked(false); + setCheckable(false); + } + +#else QToolButton::mousePressEvent(event); +#endif +} + +void XToolButton::mouseReleaseEvent(QMouseEvent *event) +{ + _is_mouse_down = false; + QToolButton::mouseReleaseEvent(event); +} + +void XToolButton::onHidePopupMenu() +{ +#ifdef _WIN32 + + setCheckable(true); + setChecked(false); + setCheckable(false); + + QWidget *widgetUnderMouse = qApp->widgetAt(QCursor::pos()); + if (widgetUnderMouse != this){ + _is_mouse_down = false; + } + + if (!_is_mouse_down || _lst_button != this){ + _click_times = 0; + } + + if (_menu != NULL){ + disconnect(_menu, SIGNAL(aboutToHide()), this, SLOT(onHidePopupMenu())); + } + +#endif } diff --git a/DSView/pv/ui/xtoolbutton.h b/DSView/pv/ui/xtoolbutton.h index 55b3d827..12cb17e5 100644 --- a/DSView/pv/ui/xtoolbutton.h +++ b/DSView/pv/ui/xtoolbutton.h @@ -25,16 +25,26 @@ #include #include #include +#include class XToolButton : public QToolButton { + Q_OBJECT + public: XToolButton(QWidget *parent = nullptr); -protected: +private: void mousePressEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; + +private slots: + void onHidePopupMenu(); + +private: + QMenu *_menu; + bool _is_mouse_down; }; - #endif \ No newline at end of file