File indexing completed on 2024-05-19 04:39:29
0001 /* 0002 SPDX-FileCopyrightText: 2004 David Faure <faure@kde.org> 0003 0004 SPDX-License-Identifier: GPL-2.0-only 0005 */ 0006 0007 #include "overlaywidget.h" 0008 0009 #include <QHBoxLayout> 0010 #include <QResizeEvent> 0011 #include <QEvent> 0012 #include <QApplication> 0013 0014 using namespace KDevelop; 0015 0016 OverlayWidget::OverlayWidget( QWidget* alignWidget, QWidget* parent, const char* name ) 0017 : QWidget( parent, Qt::Window | Qt::FramelessWindowHint | Qt::ToolTip ), mAlignWidget( nullptr ) 0018 { 0019 auto hboxHBoxLayout = new QHBoxLayout(this); 0020 hboxHBoxLayout->setContentsMargins(0, 0, 0, 0); 0021 0022 setObjectName(QString::fromUtf8(name)); 0023 setAlignWidget( alignWidget ); 0024 0025 setWindowFlags(Qt::WindowDoesNotAcceptFocus | windowFlags()); 0026 0027 qApp->installEventFilter(this); 0028 } 0029 0030 OverlayWidget::~OverlayWidget() 0031 { 0032 } 0033 0034 void OverlayWidget::reposition() 0035 { 0036 if ( !mAlignWidget ) 0037 return; 0038 // p is in the alignWidget's coordinates 0039 QPoint p; 0040 // We are always above the alignWidget, right-aligned with it. 0041 p.setX( mAlignWidget->width() - width() ); 0042 p.setY( -height() ); 0043 // Position in the global coordinates 0044 QPoint global = mAlignWidget->mapToGlobal( p ); 0045 // Move 'this' to that position. 0046 move( global ); 0047 } 0048 0049 void OverlayWidget::setAlignWidget( QWidget * w ) 0050 { 0051 if (w == mAlignWidget) 0052 return; 0053 0054 mAlignWidget = w; 0055 0056 reposition(); 0057 } 0058 0059 bool OverlayWidget::eventFilter( QObject* o, QEvent* e) 0060 { 0061 if (e->type() == QEvent::Move || e->type() == QEvent::Resize) { 0062 reposition(); 0063 } else if (e->type() == QEvent::Close) { 0064 close(); 0065 } 0066 0067 return QWidget::eventFilter(o,e); 0068 } 0069 0070 void OverlayWidget::resizeEvent( QResizeEvent* ev ) 0071 { 0072 reposition(); 0073 QWidget::resizeEvent( ev ); 0074 } 0075 0076 #include "moc_overlaywidget.cpp"