File indexing completed on 2025-09-14 03:43:32

0001 /*
0002     File                 : PresenterWidget.cpp
0003     Project              : LabPlot
0004     Description          : Widget for dynamic presenting of worksheets
0005     --------------------------------------------------------------------
0006     SPDX-FileCopyrightText: 2016 Fabian Kristof <fkristofszabolcs@gmail.com>
0007     SPDX-FileCopyrightText: 2018-2023 Alexander Semke <alexander.semke@web.de>
0008     SPDX-License-Identifier: GPL-2.0-or-later
0009 */
0010 #include "PresenterWidget.h"
0011 #include "SlidingPanel.h"
0012 #include "backend/core/Settings.h"
0013 #include "commonfrontend/worksheet/WorksheetView.h"
0014 
0015 #include <KConfigGroup>
0016 #include <QKeyEvent>
0017 #include <QPushButton>
0018 #include <QScreen>
0019 
0020 PresenterWidget::PresenterWidget(Worksheet* worksheet, QScreen* screen, bool interactive, QWidget* parent)
0021     : QWidget(parent)
0022     , m_worksheet(worksheet)
0023     , m_view(new WorksheetView(worksheet)) {
0024     setAttribute(Qt::WA_DeleteOnClose);
0025     setFocus();
0026 
0027     m_view->setParent(this);
0028     m_view->setInteractive(interactive);
0029     m_view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
0030     m_view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
0031     m_view->setContextMenuPolicy(Qt::NoContextMenu);
0032     m_view->initPlotNavigationActions(); // init the relevant actions so we can also navigate in the plots in the presenter mode
0033 
0034     const QRect& screenSize = screen->geometry();
0035     m_view->setGeometry(screenSize); // use the full screen size for the view
0036     m_view->show();
0037     m_view->setFocus();
0038 
0039     m_panel = new SlidingPanelTop(screenSize, worksheet->name(), this);
0040     qApp->installEventFilter(this);
0041     connect(m_panel->quitButton(), &QPushButton::clicked, this, [=]() {
0042         close();
0043     });
0044 
0045     if (interactive) {
0046         const auto group = Settings::group(QStringLiteral("PresenterWidget"));
0047         const auto fixed = group.readEntry("PresenterWidgetNavigationPanelFixed", false);
0048         m_navigationPanel = new SlidingPanelBottom(screenSize, m_view, fixed, this);
0049     }
0050 }
0051 
0052 PresenterWidget::~PresenterWidget() {
0053     delete m_view;
0054 
0055     // since the temporary view created in the presenter widget is using the same scene underneath,
0056     // the original view was also resized in the full screen mode if "view size" is used.
0057     // resize the original view once more to make sure it has the proper scaling after the presenter was closed.
0058     if (m_worksheet->useViewSize())
0059         static_cast<WorksheetView*>(m_worksheet->view())->processResize();
0060 
0061     if (m_navigationPanel) {
0062         // save current settings for the navigation panel
0063         auto group = Settings::group(QStringLiteral("PresenterWidget"));
0064         group.writeEntry("PresenterWidgetNavigationPanelFixed", m_navigationPanel->isFixed());
0065     }
0066 }
0067 
0068 bool PresenterWidget::eventFilter(QObject* /*watched*/, QEvent* event) {
0069     if (event->type() == QEvent::MouseMove) {
0070         bool visible = m_panel->y() == 0;
0071         const auto pos = QCursor::pos();
0072         if (!visible && m_panel->insideRect(pos))
0073             m_panel->slideShow();
0074         else if (visible && !m_panel->insideRect(pos))
0075             m_panel->slideHide();
0076 
0077         if (m_navigationPanel && !m_navigationPanel->isFixed()) {
0078             visible = m_navigationPanel->y() < screen()->geometry().bottom();
0079             if (!visible && m_navigationPanel->insideRect(pos))
0080                 m_navigationPanel->slideHide();
0081             else if (visible && !m_navigationPanel->insideRect(pos))
0082                 m_navigationPanel->slideShow();
0083         }
0084     }
0085 
0086     return false;
0087 }
0088 
0089 void PresenterWidget::keyPressEvent(QKeyEvent* event) {
0090     if (event->key() == Qt::Key_Escape)
0091         close();
0092 }
0093 
0094 void PresenterWidget::focusOutEvent(QFocusEvent* e) {
0095     if (m_view->hasFocus())
0096         setFocus();
0097 
0098     if (e->reason() & Qt::BacktabFocusReason)
0099         close();
0100 }