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"