File indexing completed on 2024-06-23 05:18:36

0001 /*
0002     This file is part of KDE.
0003 
0004     SPDX-FileCopyrightText: 2005 Cornelius Schumacher <schumacher@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.0-or-later
0007 */
0008 
0009 #include "kwindowpositioner.h"
0010 
0011 #include "messagecomposer_debug.h"
0012 #include <QScreen>
0013 
0014 using namespace MessageComposer;
0015 KWindowPositioner::KWindowPositioner(QWidget *master, QWidget *slave, Mode mode)
0016     : QObject(master)
0017     , mMaster(master)
0018     , mSlave(slave)
0019     , mMode(mode)
0020 {
0021 }
0022 
0023 void KWindowPositioner::reposition()
0024 {
0025     QPoint relativePos;
0026     if (mMode == Right) {
0027         relativePos = QPoint(mMaster->width(), 0);
0028     } else if (mMode == Bottom) {
0029         relativePos = QPoint(mMaster->width() - mSlave->frameGeometry().width(), mMaster->height());
0030     } else {
0031         qCCritical(MESSAGECOMPOSER_LOG) << "KWindowPositioner: Illegal mode";
0032     }
0033     QPoint pos = mMaster->mapToGlobal(relativePos);
0034 
0035     // fix position to avoid hiding parts of the window (needed especially when not using KWin)
0036     const QRect desktopRect(mMaster->screen()->availableGeometry());
0037     if ((pos.x() + mSlave->frameGeometry().width()) > desktopRect.width()) {
0038         pos.setX(desktopRect.width() - mSlave->frameGeometry().width());
0039     }
0040     if ((pos.y() + mSlave->frameGeometry().height()) > desktopRect.height()) {
0041         pos.setY(desktopRect.height() - mSlave->frameGeometry().height() - mMaster->height());
0042     }
0043     qCDebug(MESSAGECOMPOSER_LOG) << mMaster->pos() << mMaster->mapToGlobal(mMaster->pos()) << pos.y() << (mMaster->pos().y() - pos.y())
0044                                  << mSlave->frameGeometry().height();
0045     if (mMode == Bottom && mMaster->mapToGlobal(mMaster->pos()).y() > pos.y() && (mMaster->pos().y() - pos.y()) < mSlave->frameGeometry().height()) {
0046         pos.setY(mMaster->mapToGlobal(QPoint(0, -mSlave->frameGeometry().height())).y());
0047     }
0048     if (pos.x() < desktopRect.left()) {
0049         pos.setX(desktopRect.left());
0050     }
0051     if (pos.y() < desktopRect.top()) {
0052         pos.setY(desktopRect.top());
0053     }
0054 
0055     mSlave->move(pos);
0056     mSlave->raise();
0057 }
0058 
0059 #include "moc_kwindowpositioner.cpp"