#include "lts_frameless_dialog.h" #include #include #include #include #include #include #include #include #include #include namespace LtsWidgets { LtsFramelessDialog::LtsFramelessDialog(QWidget *parent, const Behaviour &behaviour) : QDialog(parent) { Qt::WindowFlags wf; switch (behaviour) { case Behaviour::Modal: { #ifndef TABLET_MODE setModal(true); wf |= Qt::Dialog; #else wf |= Qt::Window; #endif wf |= Qt::WindowStaysOnTopHint; break; } case Behaviour::Popup: wf |= Qt::Popup; break; } setWindowFlags(wf); QTimer *t = new QTimer(this); t->setInterval(250); connect(t, &QTimer::timeout, this, [this]() { QSize s = size(); setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, s, screenRectFromPoint(QCursor::pos()))); }); } LtsFramelessDialog::~LtsFramelessDialog() { } QRect LtsFramelessDialog::screenRectFromPoint(const QPoint &pos) const { const auto screens = QGuiApplication::screens(); for (QScreen *screen : screens) { QRect s = screen->geometry().adjusted(-50, -50, 50, 50); bool contains = s.contains(pos); if (contains) return screen->geometry(); } return QRect(); } void LtsFramelessDialog::showEvent(QShowEvent *event) { QDialog::showEvent(event); QTimer::singleShot(0, this, &LtsFramelessDialog::onUpdateGeometry); #ifdef TABLET_MODE QList scrollWidgets = findChildren(); for (auto i = scrollWidgets.begin(); i != scrollWidgets.end(); ++i) { QWidget *widget = *i; QVariant isConst = widget->property("const"); if (isConst.isValid() && isConst.toBool()) continue; addTouchScroll(widget); } #endif } void LtsFramelessDialog::addTouchScroll(QWidget *widget) { if (!widget) return; widget->setAttribute(Qt::WA_AcceptTouchEvents); QScrollArea *sca = qobject_cast(widget); if (sca) { QScroller::grabGesture(sca->viewport(), QScroller::LeftMouseButtonGesture); return; } } void LtsFramelessDialog::onUpdateGeometry() { QRect r; QWidget *p = parentWidget(); if (p) { QWidget *window = p->window(); QPoint global = window->mapToGlobal(QPoint(0,0)); QSize size = window->size(); r = QRect(global, size); } else { r = QGuiApplication::primaryScreen()->geometry(); } QSize s = size(); setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, s, r)); } }