File indexing completed on 2024-04-28 04:21:25

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 }