File indexing completed on 2024-04-28 15:40:26
0001 // SPDX-FileCopyrightText: 2023 The KPhotoAlbum Development Team 0002 // 0003 // SPDX-License-Identifier: GPL-2.0-or-later 0004 0005 #include "CursorVisibilityHandler.h" 0006 #include <QEvent> 0007 #include <QTimer> 0008 #include <chrono> 0009 0010 using namespace std::chrono_literals; 0011 0012 CursorVisibilityHandler::CursorVisibilityHandler(QWidget *parentWidget) 0013 : QObject(parentWidget) 0014 , m_parentWidget(parentWidget) 0015 , m_timer(new QTimer(this)) 0016 { 0017 m_timer->setSingleShot(true); 0018 connect(m_timer, &QTimer::timeout, this, &CursorVisibilityHandler::hideCursor); 0019 m_parentWidget->installEventFilter(this); 0020 0021 const auto children = m_parentWidget->findChildren<QWidget *>(); 0022 for (auto child : children) 0023 child->installEventFilter(this); 0024 } 0025 0026 bool CursorVisibilityHandler::eventFilter(QObject *watched, QEvent *event) 0027 { 0028 switch (event->type()) { 0029 case QEvent::MouseButtonPress: 0030 // disable cursor hiding till button release 0031 disableCursorHiding(); 0032 break; 0033 0034 case QEvent::MouseMove: 0035 // just reset the timer 0036 showCursorTemporarily(); 0037 break; 0038 0039 case QEvent::MouseButtonRelease: 0040 // enable cursor hiding and reset timer 0041 enableCursorHiding(); 0042 showCursorTemporarily(); 0043 break; 0044 0045 default: 0046 break; 0047 } 0048 return QObject::eventFilter(watched, event); 0049 } 0050 0051 void CursorVisibilityHandler::showCursorTemporarily() 0052 { 0053 if (!cursorHidingEnabled()) 0054 return; 0055 0056 m_parentWidget->unsetCursor(); 0057 m_timer->start(1500ms); 0058 } 0059 0060 void CursorVisibilityHandler::disableCursorHiding() 0061 { 0062 m_cursorHidingEnabled.push(false); 0063 m_parentWidget->unsetCursor(); 0064 } 0065 0066 void CursorVisibilityHandler::enableCursorHiding() 0067 { 0068 if (!m_cursorHidingEnabled.isEmpty()) 0069 m_cursorHidingEnabled.pop(); 0070 hideCursor(); 0071 } 0072 0073 bool CursorVisibilityHandler::cursorHidingEnabled() const 0074 { 0075 return m_cursorHidingEnabled.isEmpty(); 0076 } 0077 0078 void CursorVisibilityHandler::hideCursor() 0079 { 0080 if (!cursorHidingEnabled()) 0081 return; 0082 0083 m_parentWidget->setCursor(Qt::BlankCursor); 0084 }