|
| 1 | +// GenPassword |
| 2 | +// Copyright (c) 2023 CM0use |
| 3 | + |
| 4 | +#include "framelesswindow.h" |
| 5 | + |
| 6 | +#include <QStyle> |
| 7 | +#include <QHoverEvent> |
| 8 | +#include <QWindow> |
| 9 | + |
| 10 | +FramelessWindow::FramelessWindow(QWidget *const parent) |
| 11 | + : QMainWindow{ parent, Qt::FramelessWindowHint }, |
| 12 | + m_titleBar{ nullptr } |
| 13 | +{ } |
| 14 | + |
| 15 | +bool FramelessWindow::event(QEvent *const event) |
| 16 | +{ |
| 17 | + if (windowFlags() & Qt::FramelessWindowHint) { |
| 18 | + static Qt::Edges edges{ Qt::Edges() }; |
| 19 | + const int margin{ style()->pixelMetric(QStyle::PM_LayoutTopMargin) }; |
| 20 | + switch (event->type()) { |
| 21 | + case QEvent::MouseButtonPress: |
| 22 | + updateCursor(edges); |
| 23 | + if ((m_titleBar != nullptr) && m_titleBar->underMouse()) |
| 24 | + windowHandle()->startSystemMove(); |
| 25 | + else if (edges) |
| 26 | + windowHandle()->startSystemResize(edges); |
| 27 | + break; |
| 28 | + case QEvent::MouseButtonRelease: |
| 29 | + edges = Qt::Edges(); |
| 30 | + updateCursor(edges); |
| 31 | + setFocus(); |
| 32 | + break; |
| 33 | + case QEvent::HoverMove: { |
| 34 | + edges = Qt::Edges(); |
| 35 | + QPoint p{ static_cast<QHoverEvent *>(event)->position().toPoint() }; |
| 36 | + |
| 37 | + if (p.x() < margin) |
| 38 | + edges |= Qt::LeftEdge; |
| 39 | + if (p.x() > (width() - margin)) |
| 40 | + edges |= Qt::RightEdge; |
| 41 | + if (p.y() < margin) |
| 42 | + edges |= Qt::TopEdge; |
| 43 | + if (p.y() > (height() - margin)) |
| 44 | + edges |= Qt::BottomEdge; |
| 45 | + updateCursor(edges); |
| 46 | + break; |
| 47 | + } |
| 48 | + default: |
| 49 | + break; |
| 50 | + } |
| 51 | + } |
| 52 | + return QMainWindow::event(event); |
| 53 | +} |
| 54 | + |
| 55 | +void FramelessWindow::setTitleBar(QWidget *const widget) |
| 56 | +{ |
| 57 | + m_titleBar = widget; |
| 58 | +} |
| 59 | + |
| 60 | +QWidget* FramelessWindow::getTitleBar() const |
| 61 | +{ |
| 62 | + return m_titleBar; |
| 63 | +} |
| 64 | + |
| 65 | +void FramelessWindow::updateCursor(const Qt::Edges &edges) |
| 66 | +{ |
| 67 | + switch (edges) { |
| 68 | + case 0: |
| 69 | + setCursor(Qt::ArrowCursor); |
| 70 | + break; |
| 71 | + case Qt::LeftEdge: |
| 72 | + case Qt::RightEdge: |
| 73 | + setCursor(Qt::SizeHorCursor); |
| 74 | + break; |
| 75 | + case Qt::TopEdge: |
| 76 | + case Qt::BottomEdge: |
| 77 | + setCursor(Qt::SizeVerCursor); |
| 78 | + break; |
| 79 | + case Qt::LeftEdge | Qt::TopEdge: |
| 80 | + case Qt::RightEdge | Qt::BottomEdge: |
| 81 | + setCursor(Qt::SizeFDiagCursor); |
| 82 | + break; |
| 83 | + case Qt::RightEdge | Qt::TopEdge: |
| 84 | + case Qt::LeftEdge | Qt::BottomEdge: |
| 85 | + setCursor(Qt::SizeBDiagCursor); |
| 86 | + break; |
| 87 | + } |
| 88 | +} |
0 commit comments