diff --git a/src/assets/pulse-multiple.svg b/src/assets/pulse-multiple.svg new file mode 100644 index 0000000..c487732 --- /dev/null +++ b/src/assets/pulse-multiple.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/qml/presenter/LoadingSpinner.qml b/src/qml/presenter/LoadingSpinner.qml new file mode 100644 index 0000000..a59b867 --- /dev/null +++ b/src/qml/presenter/LoadingSpinner.qml @@ -0,0 +1,80 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 as Controls +import QtQuick.Layouts 1.15 +import QtGraphicalEffects 1.15 +import org.kde.kirigami 2.13 as Kirigami +import "./" as Presenter + +Controls.BusyIndicator { + id: root + property color color + visible: true + + contentItem: Item { + implicitWidth: 64 + implicitHeight: 64 + + Item { + id: item + x: parent.width / 2 - 32 + y: parent.height / 2 - 32 + width: 64 + height: 64 + opacity: root.running ? 1 : 0 + + Behavior on opacity { + OpacityAnimator { + duration: 250 + } + } + + Repeater { + id: repeater + model: 1 + + Rectangle { + id: delegate + required property int index + + x: item.width / 2 - width / 2 + y: item.height / 2 - height / 2 + implicitWidth: root.width + implicitHeight: root.width + radius: 500 + color: root.color + opacity: delegate.scale + /* visible: root.visible */ + + /* Text { */ + /* text: delegate.scale + " & " + delegate.opacity */ + /* } */ + + PropertyAnimation { + target: delegate + property: "scale" + running: root.visible && root.running + from: 0 + to: 1 + loops: Animation.Infinite + duration: 500 * index + easing.type: Easing.OutInExpo + easing.amplitude: 2.0 + } + + + /* transform: [ */ + /* Translate { */ + /* y: -Math.min(item.width, item.height) * 0.5 */ + /* x: index */ + /* }, */ + /* Rotation { */ + /* angle: delegate.index / repeater.count * 360 */ + /* origin.x: 5 */ + /* origin.y: 5 */ + /* } */ + /* ] */ + } + } + } + } +} diff --git a/src/qml/presenter/PreviewSlide.qml b/src/qml/presenter/PreviewSlide.qml index 9b1beda..8e543d2 100644 --- a/src/qml/presenter/PreviewSlide.qml +++ b/src/qml/presenter/PreviewSlide.qml @@ -42,6 +42,13 @@ Item { currentFrame: pdfIndex } + Presenter.LoadingSpinner { + id: loadingSpinner + color: Kirigami.Theme.highlightColor + running: true + anchors.fill: parent + } + FastBlur { id: imageBlue anchors.fill: parent diff --git a/src/resources.qrc b/src/resources.qrc index db3661a..ad8a5fb 100644 --- a/src/resources.qrc +++ b/src/resources.qrc @@ -26,7 +26,9 @@ qml/presenter/RangedSlider.qml qml/presenter/NewVideo.qml qml/presenter/TextBackground.qml + qml/presenter/LoadingSpinner.qml assets/parallel.jpg assets/black.jpg + assets/pulse-multiple.svg diff --git a/src/rust/slide_model.rs b/src/rust/slide_model.rs index adcd3bf..9499967 100644 --- a/src/rust/slide_model.rs +++ b/src/rust/slide_model.rs @@ -331,7 +331,6 @@ impl slide_model::SlideModel { screenshot.to_str().unwrap() ).insert(0, &QString::from("file://")).to_owned(); slide.video_thumbnail = screenshot_string; - // let runtime = tokio::runtime::Runtime::new().unwrap(); std::thread::spawn(move || { let result = ffmpeg::bg_from_video(&path, &screenshot); match result {