/** * @RDE_HEADER@ * FrameLess Dialog with alternatie basecolor * $Id$ * $HeadURL$ * $Author$ * * Created by Mike Wille, SLSE, 2016-03-09 */ #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-Bug? Qt::FramelessWindowHint in the underlying windows results in // mapToGlobal(QPoint(0,0)) == QPoint(0,0) when a popup window is show on top of it Qt::WindowFlags wf; // TODO: FIX WM AFTER FAT!! = Qt::FramelessWindowHint; // make frameless, composite manager drops the shadow // frameless dialogs cannot have (completety working) children dialogs => frames 4 fat 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]() { //qWarning() << "my pos" << QCursor::pos(); //qWarning() << "my screen rect" << screenRectFromPoint(QCursor::pos()); QSize s = size(); setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, s, screenRectFromPoint(QCursor::pos()))); }); //t->start(); TODO: impl this! } 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); // graceful offset for desktop managers bool contains = s.contains(pos); //qWarning() << "screen" << s << " widget" << w << " contains?" << contains; //qWarning() << "screen: x" << s.x() << "y" << s.y() << "h" << s.height() << "w" << s.width(); //qWarning() << "widget: x" << w.x() << "y" << w.y() << "h" << w.height() << "w" << w.width(); 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) // get the parent's window and center the dialog on the center of the parent's window { QWidget *window = p->window(); QPoint global = window->mapToGlobal(QPoint(0,0)); QSize size = window->size(); r = QRect(global, size); } else // no parent - no alignment! { r = QGuiApplication::primaryScreen()->geometry(); } QSize s = size(); setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, s, r)); } } // namespace LtsWidgets