Skip to content

Commit

Permalink
Merge branch 'refs/heads/features/scallop-fixes'
Browse files Browse the repository at this point in the history
  • Loading branch information
vicr123 committed Jul 16, 2023
2 parents e6f599b + b8ef904 commit 8911ffa
Show file tree
Hide file tree
Showing 12 changed files with 115 additions and 96 deletions.
3 changes: 3 additions & 0 deletions desktop/CMakeLists.txt
Expand Up @@ -134,3 +134,6 @@ install(TARGETS thedesk
BUNDLE DESTINATION /Applications)

# TODO: Port install rules over from qmake
install(DIRECTORY media
DESTINATION ${CMAKE_INSTALL_DATADIR}/thedesk
)
6 changes: 3 additions & 3 deletions libthedesk/CMakeLists.txt
Expand Up @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.4.0)

project(lib VERSION 1.0.0 LANGUAGES CXX)

find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets Multimedia DBus Svg QuickWidgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets Multimedia DBus Svg QuickWidgets MultimediaWidgets)
find_package(libcontemporary REQUIRED)
find_package(libtdesktopenvironment REQUIRED)

Expand Down Expand Up @@ -102,7 +102,7 @@ set(PRIVATE_HEADERS
)

add_library(libthedesk SHARED)
cntp_init(libthedesk 17)
cntp_init(libthedesk 20)
set_target_properties(libthedesk PROPERTIES
OUTPUT_NAME thedesk
FRAMEWORK TRUE
Expand All @@ -113,7 +113,7 @@ cntp_target_public_headers(libthedesk
HEADERS ${HEADERS}
)

target_link_libraries(libthedesk Qt::Widgets Qt::DBus Qt::Multimedia Qt::Svg Qt::QuickWidgets libcontemporary libtdesktopenvironment)
target_link_libraries(libthedesk Qt::Widgets Qt::DBus Qt::Multimedia Qt::Svg Qt::QuickWidgets Qt::MultimediaWidgets libcontemporary libtdesktopenvironment)
target_compile_definitions(libthedesk PRIVATE LIBTHEDESK_LIBRARY)

IF(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
Expand Down
2 changes: 1 addition & 1 deletion libthedesk/libthedeskConfig.cmake.in
Expand Up @@ -4,6 +4,6 @@ set(libthebranch_VERSION 1.0.0)

include("${CMAKE_CURRENT_LIST_DIR}/libthedeskTargets.cmake")

find_package(Qt6 REQUIRED COMPONENTS Widgets Multimedia DBus Svg QuickWidgets)
find_package(Qt6 REQUIRED COMPONENTS Widgets Multimedia DBus Svg QuickWidgets MultimediaWidgets)

check_required_components(libthedesk)
6 changes: 3 additions & 3 deletions libthedesk/onboarding/OnboardingVideoForm.qml
@@ -1,5 +1,5 @@
import QtQuick 2.0
import QtMultimedia 5.13
import QtMultimedia 6.4

Item {
VideoOutput {
Expand All @@ -8,8 +8,8 @@ Item {
y: 0
width: parent.width
height: parent.height
flushMode: VideoOutput.LastFrame
// flushMode: VideoOutput.LastFrame
fillMode: VideoOutput.PreserveAspectCrop
source: sourceVideo
// source: sourceVideo
}
}
75 changes: 42 additions & 33 deletions libthedesk/onboarding/onboarding.cpp
Expand Up @@ -35,9 +35,10 @@
#include <tsettings.h>
#include <tvariantanimation.h>

#include <QAudioSink>
#include <QMediaDevices>
#include <QMediaPlayer>
//#include <QMediaPlaylist>
//#include <QVideoWidget>
#include <QShortcut>

#include <private/onboardingmanager_p.h>

Expand All @@ -46,11 +47,9 @@ struct OnboardingPrivate {
QList<QPair<QString, OnboardingPage*>> steps;
QList<QPair<OnboardingStepper*, OnboardingPage*>> steppers;

// QMediaPlayer* audioPlayer = nullptr;
// QMediaPlaylist* audioPlaylist;
QByteArray singleAudioData;
QByteArray loopAudioData;
QAudioOutput* audioOutput = nullptr;
QAudioSink* audioOutput = nullptr;
QIODevice* audioOutputDevice;
int audioPointer = 0;
bool audioEnabled = true;
Expand Down Expand Up @@ -165,24 +164,18 @@ Onboarding::Onboarding(QWidget* parent) :
this->update();
});

#if 0
if (d->settings.value("Onboarding/onboardingAudio").toBool()) {
QAudioFormat format;
format.setSampleRate(44100);
format.setChannelCount(2);
format.setSampleSize(8);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::UnSignedInt);
auto format = QMediaDevices::defaultAudioOutput().preferredFormat();

QEventLoop* loop = new QEventLoop();
for (int i = 0; i < 2; i++) {
QByteArray* array = (i == 0 ? &d->singleAudioData : &d->loopAudioData);
QString setting = (i == 0 ? "Onboarding/audio.start" : "Onboarding/audio.loop");
auto file = QUrl::fromLocalFile(d->settings.value(setting).toString());

QEventLoopLocker* locker = new QEventLoopLocker(loop);
QAudioDecoder* audioDecoder = new QAudioDecoder();
audioDecoder->setSourceFilename(d->settings.value(setting).toString());
audioDecoder->setSource(file);
audioDecoder->setAudioFormat(format);
connect(audioDecoder, &QAudioDecoder::bufferReady, this, [=] {
QAudioBuffer buf = audioDecoder->read();
Expand All @@ -201,32 +194,49 @@ Onboarding::Onboarding(QWidget* parent) :
loop->exec();
loop->deleteLater();

d->audioOutput = new QAudioOutput(format);
d->audioOutput = new QAudioSink(format);
d->audioOutput->setBufferSize(176400);
d->audioOutputDevice = d->audioOutput->start();
d->audioOutput->setNotifyInterval(1000);

connect(d->audioOutput, &QAudioOutput::stateChanged, this, [=](QAudio::State state) {
qDebug() << state;
});
connect(d->audioOutput, &QAudioOutput::notify, this, &Onboarding::writeAudio);
QTimer* audioTimer = new QTimer(d->audioOutput);
audioTimer->setInterval(100);
connect(audioTimer, &QTimer::timeout, this, &Onboarding::writeAudio);
audioTimer->start();

writeAudio();
}
#endif

if (d->settings.value("Onboarding/onboardingVideo").toBool()) {
this->setAttribute(Qt::WA_TranslucentBackground);
} else {
this->startOnboarding();
}

auto* terminalShortcut = new QShortcut(QKeySequence(Qt::ControlModifier | Qt::AltModifier | Qt::Key_T), this);
connect(terminalShortcut, &QShortcut::activated, this, [this] {
this->hide();

auto env = QProcessEnvironment::systemEnvironment();
env.remove("LD_LIBRARY_PATH");

auto* proc = new QProcess(this);
proc->setProgram("theterminal");
proc->setArguments({"-e", "/bin/bash"});
proc->setWorkingDirectory(QDir::rootPath());
proc->setProcessEnvironment(env);
proc->start();
connect(proc, &QProcess::finished, this, [proc, this] {
proc->deleteLater();
this->show();
});
});
}

Onboarding::~Onboarding() {
#if 0
if (d->audioOutput) {
d->audioOutput->stop();
d->audioOutput->deleteLater();
}
#endif
delete d;
delete ui;
}
Expand Down Expand Up @@ -318,30 +328,28 @@ void Onboarding::writeAudio() {
if (!d->audioEnabled) return;
if (!d->audioOutputDevice) return;

#if 0
int bytesFree = d->audioOutput->bytesFree();
if (d->audioPointer < d->singleAudioData.count()) {
if (d->audioPointer < d->singleAudioData.length()) {
QByteArray chunk = d->singleAudioData.mid(d->audioPointer, bytesFree);
d->audioPointer += chunk.count();
bytesFree -= chunk.count();
d->audioPointer += chunk.length();
bytesFree -= chunk.length();
d->audioOutputDevice->write(chunk);
}

// Prevent ourselves from locking up in this loop
QDeadlineTimer lockTimer(50);
while (bytesFree != 0 && d->audioPointer >= d->singleAudioData.count() && !lockTimer.hasExpired()) {
if (d->audioPointer >= d->singleAudioData.count() + d->loopAudioData.count()) d->audioPointer -= d->loopAudioData.count();
QByteArray chunk = d->loopAudioData.mid(d->audioPointer - d->singleAudioData.count(), bytesFree);
d->audioPointer += chunk.count();
bytesFree -= chunk.count();
while (bytesFree != 0 && d->audioPointer >= d->singleAudioData.length() && !lockTimer.hasExpired()) {
if (d->audioPointer >= d->singleAudioData.length() + d->loopAudioData.length()) d->audioPointer -= d->loopAudioData.length();
QByteArray chunk = d->loopAudioData.mid(d->audioPointer - d->singleAudioData.length(), bytesFree);
d->audioPointer += chunk.length();
bytesFree -= chunk.length();
d->audioOutputDevice->write(chunk);
}

// Disable the audio
if (lockTimer.hasExpired()) {
d->audioEnabled = false;
}
#endif
}

void Onboarding::changeEvent(QEvent* event) {
Expand Down Expand Up @@ -388,6 +396,7 @@ void Onboarding::completeOnboarding() {
delete c;

StateManager::onboardingManager()->d->onboardingRunning = false;
emit onboardingCompleted(true);
this->accept();
});
hideBar();
Expand Down
3 changes: 3 additions & 0 deletions libthedesk/onboarding/onboarding.h
Expand Up @@ -38,6 +38,9 @@ class Onboarding : public QDialog {

void writeAudio();

signals:
void onboardingCompleted(bool complete);

private slots:
void on_stackedWidget_currentChanged(int arg1);

Expand Down
25 changes: 13 additions & 12 deletions libthedesk/onboarding/onboardingcontroller.cpp
Expand Up @@ -20,19 +20,19 @@
#include "onboardingcontroller.h"

#include "onboarding.h"
#include <tsettings.h>
#include <statemanager.h>
#include <onboardingmanager.h>
#include "server/sessionserver.h"
#include <QCoroCore>
#include <QScreen>
#include <onboardingmanager.h>
#include <statemanager.h>
#include <tsettings.h>

#include "onboardingwelcome.h"
#include "onboardingfinal.h"
#include "onboardingvideo.h"
#include "onboardingbetathankyou.h"

OnboardingController::OnboardingController(QObject* parent) : QObject(parent) {
#include "onboardingwelcome.h"

OnboardingController::OnboardingController(QObject* parent) :
QObject(parent) {
}

bool OnboardingController::performOnboarding(bool isSystemOnboarding) {
Expand All @@ -56,27 +56,28 @@ bool OnboardingController::performOnboarding(bool isSystemOnboarding) {
}
}

o.setGeometry(qApp->primaryScreen()->geometry());
o.showFullScreen();

if (videoScreens.count() > 0) {
connect(videoScreens.first(), &OnboardingVideo::startOnboarding, &o, &Onboarding::startOnboarding);
connect(videoScreens.first(), &OnboardingVideo::playAudio, &o, &Onboarding::writeAudio);
}

//Hide the splashes if needed
// Hide the splashes if needed
SessionServer::instance()->hideSplashes();

int result = o.exec();
auto result = QCoro::waitFor(qCoro(&o, &Onboarding::onboardingCompleted));
for (OnboardingVideo* video : videoScreens) {
video->close();
video->deleteLater();
}

if (result == Onboarding::Accepted) {
//Show the splashes again
if (result) {
// Show the splashes again
SessionServer::instance()->showSplashes();

//Set the onboarding flag
// Set the onboarding flag
settings.setValue("Onboarding/lastOnboarding", 1);
settings.sync();

Expand Down
2 changes: 1 addition & 1 deletion libthedesk/onboarding/onboardingstepper.cpp
Expand Up @@ -64,7 +64,7 @@ void OnboardingStepper::setIsFinal(bool isFinal) {
}

QSize OnboardingStepper::sizeHint() const {
return QSize(SC_DPI(300), this->fontMetrics().height() + SC_DPI(9));
return QSize(300, this->fontMetrics().height() + 18);
}

void OnboardingStepper::paintEvent(QPaintEvent* event) {
Expand Down
67 changes: 37 additions & 30 deletions libthedesk/onboarding/onboardingvideo.cpp
Expand Up @@ -21,16 +21,16 @@
#include "ui_onboardingvideo.h"

#include <QMediaPlayer>
//#include <QMediaPlaylist>
#include <QPainter>
#include <QQmlContext>
//#include <QVideoWidget>
#include <QTimer>
#include <QVideoFrame>
#include <QVideoSink>
#include <tsettings.h>

struct OnboardingVideoPrivate {
QMediaPlayer* videoPlayer;
// QMediaPlaylist* videoPlaylist;
// QVideoWidget* videoWidget;
QPixmap pixmap;
};

OnboardingVideo::OnboardingVideo(QWidget* parent) :
Expand All @@ -42,37 +42,38 @@ OnboardingVideo::OnboardingVideo(QWidget* parent) :
this->setCursor(QCursor(Qt::BlankCursor));

this->setWindowFlag(Qt::FramelessWindowHint);
this->setWindowFlag(Qt::WindowStaysOnBottomHint);

ui->videoWidget->setAspectRatioMode(Qt::KeepAspectRatioByExpanding);

tSettings settings;
// d->videoPlaylist = new QMediaPlaylist(this);
// d->videoPlaylist->addMedia(QUrl::fromLocalFile(settings.value("Onboarding/videos.start").toString()));
// d->videoPlaylist->addMedia(QUrl::fromLocalFile(settings.value("Onboarding/videos.middle").toString()));
// d->videoPlaylist->addMedia(QUrl::fromLocalFile(settings.value("Onboarding/videos.loop").toString()));
// d->videoPlaylist->setCurrentIndex(0);
// connect(d->videoPlaylist, &QMediaPlaylist::currentIndexChanged, this, [=](int index) {
// if (index == 1) {
// emit startOnboarding();
// this->setCursor(QCursor(Qt::ArrowCursor));
// } else if (index == 2) {
// Start looping
// d->videoPlaylist->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop);
// }
// });
auto startPlayer = mediaPlayerForFile(settings.value("Onboarding/videos.start").toString());
auto middlePlayer = mediaPlayerForFile(settings.value("Onboarding/videos.middle").toString());
auto loopPlayer = mediaPlayerForFile(settings.value("Onboarding/videos.loop").toString());

// d->videoPlayer = new QMediaPlayer(this);
// d->videoPlayer->setPlaylist(d->videoPlaylist);
// d->videoPlayer->setVolume(0);
// connect(d->videoPlayer, &QMediaPlayer::mediaStatusChanged, this, [=](QMediaPlayer::MediaStatus state) {
// if (state == QMediaPlayer::BufferedMedia || state == QMediaPlayer::BufferingMedia) {
// emit playAudio();
// }
// });
// d->videoPlayer->play();
startPlayer->setVideoOutput(ui->videoWidget);
connect(startPlayer, &QMediaPlayer::mediaStatusChanged, this, [this, middlePlayer](QMediaPlayer::MediaStatus state) {
if (state == QMediaPlayer::BufferedMedia || state == QMediaPlayer::BufferingMedia) {
emit playAudio();
} else if (state == QMediaPlayer::EndOfMedia) {
middlePlayer->play();
middlePlayer->setVideoOutput(ui->videoWidget);
QTimer::singleShot(0, this, &OnboardingVideo::startOnboarding);
}
});
connect(middlePlayer, &QMediaPlayer::mediaStatusChanged, this, [this, loopPlayer](QMediaPlayer::MediaStatus state) {
if (state == QMediaPlayer::EndOfMedia) {
loopPlayer->play();
loopPlayer->setVideoOutput(ui->videoWidget);
}
});
loopPlayer->setLoops(QMediaPlayer::Infinite);

QQmlContext* qml = ui->quickWidget->rootContext();
qml->setContextProperty("sourceVideo", this);
QVideoFrame::PaintOptions framePaintOptions;
framePaintOptions.aspectRatioMode = Qt::KeepAspectRatioByExpanding;
framePaintOptions.backgroundColor = Qt::black;

QTimer::singleShot(0, this, &OnboardingVideo::startOnboarding);
startPlayer->play();
}

OnboardingVideo::~OnboardingVideo() {
Expand All @@ -83,3 +84,9 @@ OnboardingVideo::~OnboardingVideo() {
QMediaPlayer* OnboardingVideo::mediaObject() const {
return d->videoPlayer;
}

QMediaPlayer* OnboardingVideo::mediaPlayerForFile(QString file) {
auto player = new QMediaPlayer(this);
player->setSource(QUrl::fromLocalFile(file));
return player;
}

0 comments on commit 8911ffa

Please sign in to comment.