mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
Use QWindow::setCursor instead of QGuiApplication::setCursorOverride
This commit is contained in:
parent
fe8bc30645
commit
bcc333c2e1
2 changed files with 62 additions and 112 deletions
|
@ -8,7 +8,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "window/window_title_qt.h"
|
#include "window/window_title_qt.h"
|
||||||
|
|
||||||
#include "platform/platform_specific.h"
|
#include "platform/platform_specific.h"
|
||||||
#include "base/platform/base_platform_info.h"
|
|
||||||
#include "ui/platform/ui_platform_utility.h"
|
#include "ui/platform/ui_platform_utility.h"
|
||||||
#include "ui/widgets/buttons.h"
|
#include "ui/widgets/buttons.h"
|
||||||
#include "ui/widgets/shadow.h"
|
#include "ui/widgets/shadow.h"
|
||||||
|
@ -16,11 +15,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "core/application.h"
|
#include "core/application.h"
|
||||||
#include "styles/style_window.h"
|
#include "styles/style_window.h"
|
||||||
#include "styles/style_calls.h" // st::callShadow
|
#include "styles/style_calls.h" // st::callShadow
|
||||||
#include "base/call_delayed.h"
|
|
||||||
|
|
||||||
#include <QtGui/QGuiApplication>
|
#include <QtCore/QCoreApplication>
|
||||||
#include <QtGui/QWindow>
|
#include <QtGui/QWindow>
|
||||||
#include <QtWidgets/QApplication>
|
|
||||||
|
|
||||||
namespace Window {
|
namespace Window {
|
||||||
namespace {
|
namespace {
|
||||||
|
@ -79,7 +76,7 @@ TitleWidgetQt::TitleWidgetQt(QWidget *parent)
|
||||||
}
|
}
|
||||||
|
|
||||||
TitleWidgetQt::~TitleWidgetQt() {
|
TitleWidgetQt::~TitleWidgetQt() {
|
||||||
restoreCursor();
|
window()->windowHandle()->unsetCursor();
|
||||||
|
|
||||||
if (!_windowWasFrameless) {
|
if (!_windowWasFrameless) {
|
||||||
toggleFramelessWindow(false);
|
toggleFramelessWindow(false);
|
||||||
|
@ -90,10 +87,6 @@ TitleWidgetQt::~TitleWidgetQt() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TitleWidgetQt::toggleFramelessWindow(bool enabled) {
|
|
||||||
window()->windowHandle()->setFlag(Qt::FramelessWindowHint, enabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
void TitleWidgetQt::init() {
|
void TitleWidgetQt::init() {
|
||||||
connect(
|
connect(
|
||||||
window()->windowHandle(),
|
window()->windowHandle(),
|
||||||
|
@ -125,17 +118,15 @@ void TitleWidgetQt::paintEvent(QPaintEvent *e) {
|
||||||
Painter(this).fillRect(rect(), active ? _st.bgActive : _st.bg);
|
Painter(this).fillRect(rect(), active ? _st.bgActive : _st.bg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TitleWidgetQt::toggleFramelessWindow(bool enabled) {
|
||||||
|
window()->windowHandle()->setFlag(Qt::FramelessWindowHint, enabled);
|
||||||
|
}
|
||||||
|
|
||||||
void TitleWidgetQt::updateWindowExtents() {
|
void TitleWidgetQt::updateWindowExtents() {
|
||||||
if (hasShadow()) {
|
if (hasShadow()) {
|
||||||
if (!_maximizedState) {
|
Platform::SetWindowExtents(
|
||||||
Platform::SetWindowExtents(
|
window()->windowHandle(),
|
||||||
window()->windowHandle(),
|
resizeArea());
|
||||||
ShadowExtents());
|
|
||||||
} else {
|
|
||||||
Platform::SetWindowExtents(
|
|
||||||
window()->windowHandle(),
|
|
||||||
QMargins());
|
|
||||||
}
|
|
||||||
|
|
||||||
_extentsSet = true;
|
_extentsSet = true;
|
||||||
} else if (_extentsSet) {
|
} else if (_extentsSet) {
|
||||||
|
@ -222,18 +213,7 @@ void TitleWidgetQt::resizeEvent(QResizeEvent *e) {
|
||||||
|
|
||||||
void TitleWidgetQt::mousePressEvent(QMouseEvent *e) {
|
void TitleWidgetQt::mousePressEvent(QMouseEvent *e) {
|
||||||
if (e->button() == Qt::LeftButton) {
|
if (e->button() == Qt::LeftButton) {
|
||||||
if ((crl::now() - _pressedForMoveTime)
|
_mousePressed = true;
|
||||||
< QApplication::doubleClickInterval()) {
|
|
||||||
if (_maximizedState) {
|
|
||||||
window()->setWindowState(Qt::WindowNoState);
|
|
||||||
} else {
|
|
||||||
window()->setWindowState(Qt::WindowMaximized);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
_pressedForMove = true;
|
|
||||||
_pressedForMoveTime = crl::now();
|
|
||||||
_pressedForMovePoint = e->windowPos().toPoint();
|
|
||||||
}
|
|
||||||
} else if (e->button() == Qt::RightButton) {
|
} else if (e->button() == Qt::RightButton) {
|
||||||
Platform::ShowWindowMenu(window()->windowHandle());
|
Platform::ShowWindowMenu(window()->windowHandle());
|
||||||
}
|
}
|
||||||
|
@ -241,7 +221,21 @@ void TitleWidgetQt::mousePressEvent(QMouseEvent *e) {
|
||||||
|
|
||||||
void TitleWidgetQt::mouseReleaseEvent(QMouseEvent *e) {
|
void TitleWidgetQt::mouseReleaseEvent(QMouseEvent *e) {
|
||||||
if (e->button() == Qt::LeftButton) {
|
if (e->button() == Qt::LeftButton) {
|
||||||
_pressedForMove = false;
|
_mousePressed = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TitleWidgetQt::mouseMoveEvent(QMouseEvent *e) {
|
||||||
|
if (_mousePressed) {
|
||||||
|
startMove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TitleWidgetQt::mouseDoubleClickEvent(QMouseEvent *e) {
|
||||||
|
if (_maximizedState) {
|
||||||
|
window()->setWindowState(Qt::WindowNoState);
|
||||||
|
} else {
|
||||||
|
window()->setWindowState(Qt::WindowMaximized);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -253,34 +247,18 @@ bool TitleWidgetQt::eventFilter(QObject *obj, QEvent *e) {
|
||||||
const auto mouseEvent = static_cast<QMouseEvent*>(e);
|
const auto mouseEvent = static_cast<QMouseEvent*>(e);
|
||||||
const auto currentPoint = mouseEvent->windowPos().toPoint();
|
const auto currentPoint = mouseEvent->windowPos().toPoint();
|
||||||
const auto edges = edgesFromPos(currentPoint);
|
const auto edges = edgesFromPos(currentPoint);
|
||||||
const auto dragDistance = QApplication::startDragDistance();
|
|
||||||
|
|
||||||
if (e->type() == QEvent::MouseMove
|
if (e->type() == QEvent::MouseMove
|
||||||
&& mouseEvent->buttons() == Qt::NoButton) {
|
&& mouseEvent->buttons() == Qt::NoButton) {
|
||||||
if (_pressedForMove) {
|
|
||||||
_pressedForMove = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
updateCursor(edges);
|
updateCursor(edges);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e->type() == QEvent::MouseMove
|
|
||||||
&& _pressedForMove
|
|
||||||
&& ((currentPoint - _pressedForMovePoint).manhattanLength()
|
|
||||||
>= dragDistance)) {
|
|
||||||
return startMove();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (e->type() == QEvent::MouseButtonPress
|
if (e->type() == QEvent::MouseButtonPress
|
||||||
&& mouseEvent->button() == Qt::LeftButton
|
&& mouseEvent->button() == Qt::LeftButton
|
||||||
&& !_maximizedState) {
|
&& edges) {
|
||||||
return startResize(edges);
|
return startResize(edges);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (e->type() == QEvent::Leave) {
|
|
||||||
if (obj->isWidgetType() && window() == static_cast<QWidget*>(obj)) {
|
|
||||||
restoreCursor();
|
|
||||||
}
|
|
||||||
} else if (e->type() == QEvent::Move
|
} else if (e->type() == QEvent::Move
|
||||||
|| e->type() == QEvent::Resize) {
|
|| e->type() == QEvent::Resize) {
|
||||||
if (obj->isWidgetType() && window() == static_cast<QWidget*>(obj)) {
|
if (obj->isWidgetType() && window() == static_cast<QWidget*>(obj)) {
|
||||||
|
@ -346,83 +324,59 @@ void TitleWidgetQt::updateButtonsState() {
|
||||||
: nullptr);
|
: nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
int TitleWidgetQt::getResizeArea(Qt::Edge edge) const {
|
QMargins TitleWidgetQt::resizeArea() const {
|
||||||
if (!hasShadow()) {
|
if (_maximizedState) {
|
||||||
return st::windowResizeArea;
|
return QMargins();
|
||||||
|
} else if (!hasShadow()) {
|
||||||
|
return QMargins(
|
||||||
|
st::windowResizeArea,
|
||||||
|
st::windowResizeArea,
|
||||||
|
st::windowResizeArea,
|
||||||
|
st::windowResizeArea);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (edge == Qt::LeftEdge) {
|
return ShadowExtents();
|
||||||
return ShadowExtents().left();
|
|
||||||
} else if (edge == Qt::RightEdge) {
|
|
||||||
return ShadowExtents().right();
|
|
||||||
} else if (edge == Qt::TopEdge) {
|
|
||||||
return ShadowExtents().top();
|
|
||||||
} else if (edge == Qt::BottomEdge) {
|
|
||||||
return ShadowExtents().bottom();
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Qt::Edges TitleWidgetQt::edgesFromPos(const QPoint &pos) {
|
Qt::Edges TitleWidgetQt::edgesFromPos(const QPoint &pos) const {
|
||||||
if (pos.x() <= getResizeArea(Qt::LeftEdge)) {
|
if (pos.x() <= resizeArea().left()) {
|
||||||
if (pos.y() <= getResizeArea(Qt::TopEdge)) {
|
if (pos.y() <= resizeArea().top()) {
|
||||||
return Qt::LeftEdge | Qt::TopEdge;
|
return Qt::LeftEdge | Qt::TopEdge;
|
||||||
} else if (pos.y()
|
} else if (pos.y() >= (window()->height() - resizeArea().bottom())) {
|
||||||
>= (window()->height() - getResizeArea(Qt::BottomEdge))) {
|
|
||||||
return Qt::LeftEdge | Qt::BottomEdge;
|
return Qt::LeftEdge | Qt::BottomEdge;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Qt::LeftEdge;
|
return Qt::LeftEdge;
|
||||||
} else if (pos.x()
|
} else if (pos.x() >= (window()->width() - resizeArea().right())) {
|
||||||
>= (window()->width() - getResizeArea(Qt::RightEdge))) {
|
if (pos.y() <= resizeArea().top()) {
|
||||||
if (pos.y() <= getResizeArea(Qt::TopEdge)) {
|
|
||||||
return Qt::RightEdge | Qt::TopEdge;
|
return Qt::RightEdge | Qt::TopEdge;
|
||||||
} else if (pos.y()
|
} else if (pos.y() >= (window()->height() - resizeArea().bottom())) {
|
||||||
>= (window()->height() - getResizeArea(Qt::BottomEdge))) {
|
|
||||||
return Qt::RightEdge | Qt::BottomEdge;
|
return Qt::RightEdge | Qt::BottomEdge;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Qt::RightEdge;
|
return Qt::RightEdge;
|
||||||
} else if (pos.y() <= getResizeArea(Qt::TopEdge)) {
|
} else if (pos.y() <= resizeArea().top()) {
|
||||||
return Qt::TopEdge;
|
return Qt::TopEdge;
|
||||||
} else if (pos.y()
|
} else if (pos.y() >= (window()->height() - resizeArea().bottom())) {
|
||||||
>= (window()->height() - getResizeArea(Qt::BottomEdge))) {
|
|
||||||
return Qt::BottomEdge;
|
return Qt::BottomEdge;
|
||||||
} else {
|
} else {
|
||||||
return Qt::Edges();
|
return Qt::Edges();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TitleWidgetQt::restoreCursor() {
|
|
||||||
if (_cursorOverriden) {
|
|
||||||
_cursorOverriden = false;
|
|
||||||
QGuiApplication::restoreOverrideCursor();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void TitleWidgetQt::updateCursor(Qt::Edges edges) {
|
void TitleWidgetQt::updateCursor(Qt::Edges edges) {
|
||||||
if (!edges || _maximizedState) {
|
|
||||||
restoreCursor();
|
|
||||||
return;
|
|
||||||
} else if (!QGuiApplication::overrideCursor()) {
|
|
||||||
_cursorOverriden = false;
|
|
||||||
}
|
|
||||||
if (!_cursorOverriden) {
|
|
||||||
_cursorOverriden = true;
|
|
||||||
QGuiApplication::setOverrideCursor(QCursor());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (((edges & Qt::LeftEdge) && (edges & Qt::TopEdge))
|
if (((edges & Qt::LeftEdge) && (edges & Qt::TopEdge))
|
||||||
|| ((edges & Qt::RightEdge) && (edges & Qt::BottomEdge))) {
|
|| ((edges & Qt::RightEdge) && (edges & Qt::BottomEdge))) {
|
||||||
QGuiApplication::changeOverrideCursor(QCursor(Qt::SizeFDiagCursor));
|
window()->windowHandle()->setCursor(QCursor(Qt::SizeFDiagCursor));
|
||||||
} else if (((edges & Qt::LeftEdge) && (edges & Qt::BottomEdge))
|
} else if (((edges & Qt::LeftEdge) && (edges & Qt::BottomEdge))
|
||||||
|| ((edges & Qt::RightEdge) && (edges & Qt::TopEdge))) {
|
|| ((edges & Qt::RightEdge) && (edges & Qt::TopEdge))) {
|
||||||
QGuiApplication::changeOverrideCursor(QCursor(Qt::SizeBDiagCursor));
|
window()->windowHandle()->setCursor(QCursor(Qt::SizeBDiagCursor));
|
||||||
} else if ((edges & Qt::LeftEdge) || (edges & Qt::RightEdge)) {
|
} else if ((edges & Qt::LeftEdge) || (edges & Qt::RightEdge)) {
|
||||||
QGuiApplication::changeOverrideCursor(QCursor(Qt::SizeHorCursor));
|
window()->windowHandle()->setCursor(QCursor(Qt::SizeHorCursor));
|
||||||
} else if ((edges & Qt::TopEdge) || (edges & Qt::BottomEdge)) {
|
} else if ((edges & Qt::TopEdge) || (edges & Qt::BottomEdge)) {
|
||||||
QGuiApplication::changeOverrideCursor(QCursor(Qt::SizeVerCursor));
|
window()->windowHandle()->setCursor(QCursor(Qt::SizeVerCursor));
|
||||||
|
} else {
|
||||||
|
window()->windowHandle()->unsetCursor();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -441,17 +395,15 @@ bool TitleWidgetQt::startMove() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TitleWidgetQt::startResize(Qt::Edges edges) {
|
bool TitleWidgetQt::startResize(Qt::Edges edges) {
|
||||||
if (edges) {
|
if (Platform::StartSystemResize(window()->windowHandle(), edges)) {
|
||||||
if (Platform::StartSystemResize(window()->windowHandle(), edges)) {
|
return true;
|
||||||
return true;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) || defined DESKTOP_APP_QT_PATCHED
|
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) || defined DESKTOP_APP_QT_PATCHED
|
||||||
if (window()->windowHandle()->startSystemResize(edges)) {
|
if (window()->windowHandle()->startSystemResize(edges)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
#endif // Qt >= 5.15 || DESKTOP_APP_QT_PATCHED
|
|
||||||
}
|
}
|
||||||
|
#endif // Qt >= 5.15 || DESKTOP_APP_QT_PATCHED
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,8 @@ protected:
|
||||||
void resizeEvent(QResizeEvent *e) override;
|
void resizeEvent(QResizeEvent *e) override;
|
||||||
void mousePressEvent(QMouseEvent *e) override;
|
void mousePressEvent(QMouseEvent *e) override;
|
||||||
void mouseReleaseEvent(QMouseEvent *e) override;
|
void mouseReleaseEvent(QMouseEvent *e) override;
|
||||||
|
void mouseMoveEvent(QMouseEvent *e) override;
|
||||||
|
void mouseDoubleClickEvent(QMouseEvent *e) override;
|
||||||
|
|
||||||
bool eventFilter(QObject *obj, QEvent *e) override;
|
bool eventFilter(QObject *obj, QEvent *e) override;
|
||||||
|
|
||||||
|
@ -49,10 +51,9 @@ private:
|
||||||
|
|
||||||
void toggleFramelessWindow(bool enabled);
|
void toggleFramelessWindow(bool enabled);
|
||||||
bool hasShadow() const;
|
bool hasShadow() const;
|
||||||
int getResizeArea(Qt::Edge edge) const;
|
QMargins resizeArea() const;
|
||||||
Qt::Edges edgesFromPos(const QPoint &pos);
|
Qt::Edges edgesFromPos(const QPoint &pos) const;
|
||||||
void updateCursor(Qt::Edges edges);
|
void updateCursor(Qt::Edges edges);
|
||||||
void restoreCursor();
|
|
||||||
bool startMove();
|
bool startMove();
|
||||||
bool startResize(Qt::Edges edges);
|
bool startResize(Qt::Edges edges);
|
||||||
|
|
||||||
|
@ -65,11 +66,8 @@ private:
|
||||||
bool _maximizedState = false;
|
bool _maximizedState = false;
|
||||||
bool _activeState = false;
|
bool _activeState = false;
|
||||||
bool _windowWasFrameless = false;
|
bool _windowWasFrameless = false;
|
||||||
bool _cursorOverriden = false;
|
|
||||||
bool _extentsSet = false;
|
bool _extentsSet = false;
|
||||||
bool _pressedForMove = false;
|
bool _mousePressed = false;
|
||||||
crl::time _pressedForMoveTime = 0;
|
|
||||||
QPoint _pressedForMovePoint;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue