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 }