#include "lts_frameless_dialog.h" #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)); } } // namespace LtsWidgets