/**************************************************************************** ** ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/ ** ** This file is part of the QML Presentation System. ** ** $QT_BEGIN_LICENSE:LGPL$ ** GNU Lesser General Public License Usage ** This file may be used under the terms of the GNU Lesser General Public ** License version 2.1 as published by the Free Software Foundation and ** appearing in the file LICENSE.LGPL included in the packaging of this ** file. Please review the following information to ensure the GNU Lesser ** General Public License version 2.1 requirements will be met: ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU General ** Public License version 3.0 as published by the Free Software Foundation ** and appearing in the file LICENSE.GPL included in the packaging of this ** file. Please review the following information to ensure the GNU General ** Public License version 3.0 requirements will be met: ** http://www.gnu.org/copyleft/gpl.html. ** ** Other Usage ** Alternatively, this file may be used in accordance with the terms and ** conditions contained in a signed written agreement between you and Digia. ** ** ** ** ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import QtQuick.Window 2.0 Item { id: root property variant slides: [] property int currentSlide; property bool showNotes: false; property color titleColor: textColor; property color textColor: "black" property string fontFamily: "Helvetica" property string codeFontFamily: "Courier New" property real masterVolume: 0.5 // Private API property bool _faded: false property int _userNum; Component.onCompleted: { var slideCount = 0; var slides = []; for (var i=0; i 0) { root.currentSlide = 0; root.slides[root.currentSlide].visible = true; } } function switchSlides(from, to, forward) { from.visible = false to.visible = true return true } function goToNextSlide() { root._userNum = 0 if (_faded) return if (root.currentSlide + 1 < root.slides.length) { var from = slides[currentSlide] var to = slides[currentSlide + 1] to.textAnimating = true if (switchSlides(from, to, true)) { currentSlide = currentSlide + 1; root.focus = true; } } timer.stop() if (slides[currentSlide].shouldTimeout) timer.start() } function goToPreviousSlide() { root._userNum = 0 if (root._faded) return if (root.currentSlide - 1 >= 0) { var from = slides[currentSlide] var to = slides[currentSlide - 1] to.textAnimating = false if (switchSlides(from, to, false)) { currentSlide = currentSlide - 1; root.focus = true; } } timer.stop() } function goToUserSlide() { --_userNum; if (root._faded || _userNum >= root.slides.length) return if (_userNum < 0) goToNextSlide() else if (root.currentSlide != _userNum) { var from = slides[currentSlide] var to = slides[_userNum] if (switchSlides(from, to, _userNum > currentSlide)) { currentSlide = _userNum; root.focus = true; } } timer.stop() } Timer { id: timer interval: slides[currentSlide].timeout > 0 ? slides[currentSlide].timeout : 7000 running: false onTriggered: goToNextSlide() } focus: true Keys.onSpacePressed: goToNextSlide() Keys.onRightPressed: goToNextSlide() Keys.onDownPressed: goToNextSlide() Keys.onLeftPressed: goToPreviousSlide() Keys.onUpPressed: goToPreviousSlide() Keys.onEscapePressed: Qt.quit() Keys.onPressed: { if (event.key >= Qt.Key_0 && event.key <= Qt.Key_9) _userNum = 10 * _userNum + (event.key - Qt.Key_0) else { if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) goToUserSlide(); else if (event.key === Qt.Key_VolumeUp) root.masterVolume = Math.min(1.0, root.masterVolume + 0.1) else if (event.key === Qt.Key_VolumeDown) root.masterVolume = Math.max(0.0, root.masterVolume - 0.1) else if (event.key === Qt.Key_VolumeMute) root.masterVolume = 0.0 else if (event.key === Qt.Key_Backspace) goToPreviousSlide(); else if (event.key === Qt.Key_C) root._faded = !root._faded; _userNum = 0; } } Keys.onReleased: { if (event.key === Qt.Key_Back) { if (root.currentSlide > 0) { goToPreviousSlide() event.accepted = true } } } Rectangle { z: 1000 color: "black" anchors.fill: parent opacity: root._faded ? 1 : 0 Behavior on opacity { NumberAnimation { duration: 250 } } } MouseArea { id: mouseArea anchors.fill: parent acceptedButtons: Qt.LeftButton | Qt.RightButton onClicked: { if (mouse.button == Qt.RightButton) goToPreviousSlide() else goToNextSlide() } onPressAndHold: goToPreviousSlide(); //A back mechanism for touch only devices } Window { id: notesWindow; width: 400 height: 300 title: "QML Presentation: Notes" visible: root.showNotes Text { anchors.fill: parent anchors.margins: parent.height * 0.1; font.pixelSize: 16 wrapMode: Text.WordWrap property string notes: root.slides[root.currentSlide].notes; text: notes == "" ? "Slide has no notes..." : notes; font.italic: notes == ""; } } Text { id: tapToAdvance color: textColor anchors.bottom: parent.bottom anchors.bottomMargin: parent.height * 0.01 anchors.horizontalCenter: parent.horizontalCenter text: "[ Tap to advance ]" font.family: fontFamily font.pixelSize: slides[currentSlide].baseFontSize opacity: slides[currentSlide].showTapToAdvance ? 1.0 : 0.0 visible: opacity > 0.0 Behavior on opacity { NumberAnimation { duration: 400 } } } }