#include "scanflag.hh" #include #include #include ScanFlag::ScanFlag( QWidget * parent ): QMainWindow( parent ), pushButton( new QPushButton( this ) ) { pushButton->setIcon( QIcon( ":/icons/programicon.png" ) ); setCentralWidget( pushButton ); setFixedSize( 30, 30 ); setWindowFlags( Qt::ToolTip | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::WindowDoesNotAcceptFocus ); setAttribute( Qt::WA_TranslucentBackground ); setAttribute( Qt::WA_X11DoNotAcceptFocus ); hideTimer.setSingleShot( true ); hideTimer.setInterval( 1000 ); connect( &hideTimer, &QTimer::timeout, this, &ScanFlag::hideWindow ); connect( pushButton, &QPushButton::clicked, this, &ScanFlag::pushButtonClicked ); } void ScanFlag::pushButtonClicked() { hideTimer.stop(); hide(); emit requestScanPopup(); } void ScanFlag::hideWindow() { if ( isVisible() ) hide(); } void ScanFlag::showScanFlag() { if ( isVisible() ) hide(); QPoint currentPos = QCursor::pos(); auto screen = QGuiApplication::screenAt( currentPos ); if ( !screen ) return; QRect desktop = screen->geometry(); QSize windowSize = geometry().size(); int x, y; /// Try the to-the-right placement if ( currentPos.x() + 4 + windowSize.width() <= desktop.topRight().x() ) { x = currentPos.x() + 4; } else if ( currentPos.x() - 4 - windowSize.width() >= desktop.x() ) { /// Try the to-the-left placement x = currentPos.x() - 4 - windowSize.width(); } else { // Center it x = desktop.x() + ( desktop.width() - windowSize.width() ) / 2; } /// Try the to-the-top placement if ( currentPos.y() - 15 - windowSize.height() >= desktop.y() ) { y = currentPos.y() - 15 - windowSize.height(); } else if ( currentPos.y() + 15 + windowSize.height() <= desktop.bottomLeft().y() ) { /// Try the to-the-bottom placement y = currentPos.y() + 15; } else { // Center it y = desktop.y() + ( desktop.height() - windowSize.height() ) / 2; } move( x, y ); show(); hideTimer.start(); }