2
0
forked from Ivasoft/DSView

Update the tool button for windows, fix a but about switching it's status

This commit is contained in:
dreamsourcelabTAI
2024-04-25 20:33:31 +08:00
parent 1103329ee6
commit 680b0260f0
5 changed files with 97 additions and 23 deletions

View File

@@ -29,6 +29,7 @@
#include <QFormLayout>
#include <QSlider>
#include <list>
#include <QKeyEvent>
#include "../toolbars/titlebar.h"
#include "dsdialog.h"
#include "../ui/uimanager.h"

View File

@@ -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()));

View File

@@ -23,9 +23,9 @@
#define DSVIEW_PV_TOOLBARS_TITLEBAR_H
#include <QWidget>
#include <QToolButton>
#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;

View File

@@ -21,29 +21,92 @@
#include "xtoolbutton.h"
#include <QMenu>
#include "../log.h"
#include <QApplication>
#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
}

View File

@@ -25,16 +25,26 @@
#include <QWidget>
#include <QToolButton>
#include <QMouseEvent>
#include <QPoint>
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