1
0
mirror of https://gitlab.com/kelteseth/ScreenPlay.git synced 2024-11-22 10:42:29 +01:00

Fix start of wallpaper

This commit is contained in:
Elias Steurer 2024-05-21 14:06:28 +02:00
parent 7dcaa3b016
commit 00d77d815e
9 changed files with 317 additions and 285 deletions

View File

@ -51,223 +51,25 @@ public:
Q_INVOKABLE bool removeAllWidgets(bool saveToProfile = false); Q_INVOKABLE bool removeAllWidgets(bool saveToProfile = false);
Q_INVOKABLE bool removeWallpaperAt(const int index); Q_INVOKABLE bool removeWallpaperAt(const int index);
// Timeline wallpaper updates:
// 1. Disable timeline updates
// Optional: 1.1 Insert new timeline
// 2. Call setWallpaperAtTimelineIndex
Q_INVOKABLE ScreenPlayWallpaper* getWallpaperByAppID(const QString& appID); Q_INVOKABLE ScreenPlayWallpaper* getWallpaperByAppID(const QString& appID);
// We always handle the endTimeString, because it is the handle for the
// timeline. The last, default, timeline does not have a handle.
Q_INVOKABLE bool moveTimelineAt( Q_INVOKABLE bool moveTimelineAt(
const int index, const int index,
const QString identifier, const QString identifier,
const float relativePosition, const float relativePosition,
QString positionTimeString) QString positionTimeString);
{
m_contentTimer.stop();
auto updateTimer = qScopeGuard([this] { m_contentTimer.start(); });
auto& wallpapterTimelineSection = m_wallpaperTimelineSectionsList.at(index); Q_INVOKABLE QString getTimeString(double relativeLinePosition);
QTime newPositionTime = QTime::fromString(positionTimeString, "hh:mm");
if (!newPositionTime.isValid()) {
qWarning() << "Unable to move with invalid time:" << positionTimeString;
return false;
}
wallpapterTimelineSection->endTime = newPositionTime;
wallpapterTimelineSection->relativePosition = relativePosition;
// We set the identifier here, because we generate it in qml
// The identiefier is only used for debugging
wallpapterTimelineSection->identifier = identifier;
const auto timelineCount = m_wallpaperTimelineSectionsList.size();
// Only update the next timeline startTime
// if we are not end last wallpaper, that always
// must end at 24:00
if (index <= timelineCount) {
auto& wallpapterTimelineSectionNext = m_wallpaperTimelineSectionsList.at(index + 1);
wallpapterTimelineSectionNext->startTime = newPositionTime;
}
printTimelines();
return true;
}
Q_INVOKABLE QString getTimeString(double relativeLinePosition)
{
const double totalHours = relativeLinePosition * 24;
int hours = static_cast<int>(std::floor(totalHours)); // Gets the whole hour part
double fractionalHours = totalHours - hours;
int minutes = static_cast<int>(std::floor(fractionalHours * 60)); // Calculates the minutes
double fractionalMinutes = fractionalHours * 60 - minutes;
int seconds = static_cast<int>(std::round(fractionalMinutes * 60)); // Calculates the seconds
// Adjust minutes and seconds if seconds rolled over to 60
if (seconds == 60) {
seconds = 0;
minutes += 1;
}
// Adjust hours and minutes if minutes rolled over to 60
if (minutes == 60) {
minutes = 0;
hours += 1;
}
// Ensure hours wrap correctly at 24
if (hours == 24) {
hours = 0;
}
// Format the output to "HH:MM:SS"
return QString("%1:%2:%3").arg(hours, 2, 10, QChar('0')).arg(minutes, 2, 10, QChar('0')).arg(seconds, 2, 10, QChar('0'));
}
void updateIndices()
{
// Sort the vector based on relativePosition
std::sort(m_wallpaperTimelineSectionsList.begin(), m_wallpaperTimelineSectionsList.end(),
[](const auto& a, const auto& b) {
return a->startTime < b->startTime;
});
// Update the indices based on new order
for (int i = 0; i < m_wallpaperTimelineSectionsList.size(); ++i) {
m_wallpaperTimelineSectionsList[i]->index = i;
}
}
Q_INVOKABLE bool addTimelineAt( Q_INVOKABLE bool addTimelineAt(
const int index, const int index,
const float reltiaveLinePosition, const float reltiaveLinePosition,
QString identifier) QString identifier);
{
m_contentTimer.stop();
auto updateTimer = qScopeGuard([this] { m_contentTimer.start(); });
// We always get the new endTime
const QString newStopPosition = getTimeString(reltiaveLinePosition);
QTime newStopPositionTime = QTime::fromString(newStopPosition, m_timelineTimeFormat);
if (!newStopPositionTime.isValid()) {
return false;
}
// IMPORTANT: The new element is always on the left. The first
// handle always persists because the
// user can never delete it. It only gets "pushed" further
// to the right, by increasing the size.
// | Insert here
// ˇ
// |-----------------------------------------------|
// 0 ID: AAA
//
//
// |-----------------------|-----------------------|
// 0 ID: BBB 1 - ID: AAA
// We directly get the new index of 0 in this example from qml
auto newTimelineSection = std::make_shared<WallpaperTimelineSection>();
newTimelineSection->index = index;
newTimelineSection->identifier = identifier;
newTimelineSection->endTime = newStopPositionTime;
// We can use the given index here, because it points
// the the current item at that index, and we have not yet
// added our new timelineSection to our list.
newTimelineSection->startTime = m_wallpaperTimelineSectionsList.at(index)->startTime;
const bool isLast = (m_wallpaperTimelineSectionsList.length() - 1) == index;
if(isLast){
m_wallpaperTimelineSectionsList.last()->startTime = newTimelineSection->endTime;
}
m_wallpaperTimelineSectionsList.append(newTimelineSection);
updateIndices();
printTimelines();
return true;
}
Q_INVOKABLE bool removeTimelineAt(const int index)
{
printTimelines();
const auto timelineCount = m_wallpaperTimelineSectionsList.size();
if (timelineCount == 0) {
qCritical() << "Timeline empty";
return false;
}
if (timelineCount == 1) {
qCritical() << "Timeline must always have at least one element, that span across the whole timeline from 00:00:00 to 23:59:59.";
return false;
}
m_contentTimer.stop();
auto updateTimer = qScopeGuard([this] { m_contentTimer.start(); });
auto& wallpapterTimelineSection = m_wallpaperTimelineSectionsList.at(index);
// When we have two timelines, we know that only the first
// timeline can be removed and the second one will then span
// across the whole timeline
// remove <- expand
// |-----------|-----------|
// 0 1
if (timelineCount == 2) {
if (index != 0) {
qCritical() << "Removing the last timeline is not allowed. This must always span the whole timeline";
return false;
}
m_wallpaperTimelineSectionsList.removeAt(index);
m_wallpaperTimelineSectionsList.first()->startTime = QTime::fromString("00:00:00", m_timelineTimeFormat);
updateIndices();
printTimelines();
return true;
}
// Now handle all states where we have more than two wallpaper
// There is no timeline before if we want to remove
// the timeline at index 0. We do not need to make the same
// check for the timelineAfter, because the last timeline
// cannot be deleted
QTime endTime;
if(index == 0){
endTime = QTime::fromString("00:00:00", m_timelineTimeFormat);
}else {
endTime = m_wallpaperTimelineSectionsList.at(index - 1)->endTime;
}
auto timelineAfter = m_wallpaperTimelineSectionsList.at(index + 1);
// before remove <- expand
// |-----------|-----------|-----------|
// 0 1 2
// Now when removing timeline at index 1, the next (after)
// wallpaper gets the remaining space
timelineAfter->startTime = endTime;
m_wallpaperTimelineSectionsList.removeAt(index);
updateIndices();
printTimelines();
return true;
printTimelines();
return true;
}
void printTimelines()
{
std::cout << "#############################\n";
for (auto& timeline : m_wallpaperTimelineSectionsList) {
std::cout <<timeline->index << ": " << timeline->identifier.toStdString() << "\t" << timeline->relativePosition << " start: " << timeline->startTime.toString().toStdString() << " end: " << timeline->endTime.toString().toStdString() << std::endl;
}
}
Q_INVOKABLE QVariantMap initialStopPositions()
{
QVariantMap sectionPositions;
for (const auto& timelineSection : m_wallpaperTimelineSectionsList) {
sectionPositions.insert({timelineSection->identifier},{timelineSection->relativePosition});
}
return sectionPositions;
}
Q_INVOKABLE bool removeTimelineAt(const int index);
Q_INVOKABLE QVariantMap initialStopPositions();
Q_INVOKABLE bool setWallpaperAtTimelineIndex( Q_INVOKABLE bool setWallpaperAtTimelineIndex(
const ScreenPlay::ContentTypes::InstalledType type, const ScreenPlay::ContentTypes::InstalledType type,
const ScreenPlay::Video::FillMode fillMode, const ScreenPlay::Video::FillMode fillMode,
@ -279,8 +81,7 @@ public:
const float playbackRate, const float playbackRate,
const QJsonObject& properties, const QJsonObject& properties,
const int timelineIndex, const int timelineIndex,
const QString& startTimeString, const QString& identifier,
const QString& endTimeString,
const bool saveToProfilesConfigFile); const bool saveToProfilesConfigFile);
Q_INVOKABLE bool createWidget( Q_INVOKABLE bool createWidget(
@ -297,8 +98,8 @@ public:
Q_INVOKABLE bool setWallpaperFillModeAtMonitorIndex(const int index, const int fillmode); Q_INVOKABLE bool setWallpaperFillModeAtMonitorIndex(const int index, const int fillmode);
Q_INVOKABLE bool setAllWallpaperValue(const QString& key, const QString& value); Q_INVOKABLE bool setAllWallpaperValue(const QString& key, const QString& value);
Q_INVOKABLE bool setWallpaperValue(const QString& appID, const QString& key, const QString& value); Q_INVOKABLE bool setWallpaperValue(const QString& appID, const QString& key, const QString& value);
QVersionNumber getProfilesVersion() const;
bool removeWallpaperAtTimelineIndex(const int timelineIndex, const int monitorIndex);
signals: signals:
void activeWallpaperCounterChanged(int activeWallpaperCounter); void activeWallpaperCounterChanged(int activeWallpaperCounter);
void activeWidgetsCounterChanged(int activeWidgetsCounter); void activeWidgetsCounterChanged(int activeWidgetsCounter);
@ -366,7 +167,10 @@ public slots:
} }
private: private:
void printTimelines();
bool loadProfiles(); bool loadProfiles();
void updateIndices();
bool loadWidgetConfig(const QJsonObject& widget); bool loadWidgetConfig(const QJsonObject& widget);
std::optional<WallpaperData> loadWallpaperConfig(const QJsonObject& wallpaper); std::optional<WallpaperData> loadWallpaperConfig(const QJsonObject& wallpaper);
bool checkIsAnotherScreenPlayInstanceRunning(); bool checkIsAnotherScreenPlayInstanceRunning();
@ -397,5 +201,6 @@ private:
// We use a 24 hour system // We use a 24 hour system
const QString m_timelineTimeFormat = "hh:mm:ss"; const QString m_timelineTimeFormat = "hh:mm:ss";
const quint16 m_webSocketPort = 16395; const quint16 m_webSocketPort = 16395;
}; };
} }

View File

@ -122,6 +122,9 @@ public:
ScreenPlay::Settings::DesktopEnvironment desktopEnvironment() const { return m_desktopEnvironment; } ScreenPlay::Settings::DesktopEnvironment desktopEnvironment() const { return m_desktopEnvironment; }
const QString& buildInfos() const { return m_buildInfos; } const QString& buildInfos() const { return m_buildInfos; }
bool showDefaultContent() const { return m_showDefaultContent; } bool showDefaultContent() const { return m_showDefaultContent; }
void writeDefaultProfiles();
QVersionNumber getProfilesVersion() const;
signals: signals:
void requestRetranslation(); void requestRetranslation();
@ -146,7 +149,7 @@ signals:
public slots: public slots:
void setupLanguage(); void setupLanguage();
void writeJsonFileFromResource(const QString& filename); void initProfilesSettings();
void setupWidgetAndWindowPaths(); void setupWidgetAndWindowPaths();
bool retranslateUI(); bool retranslateUI();
@ -167,7 +170,6 @@ public slots:
void setBuildInfos(const QString& buildInfos); void setBuildInfos(const QString& buildInfos);
private: private:
void restoreDefault(const QString& appConfigLocation, const QString& settingsFileType);
void initInstalledPath(); void initInstalledPath();
void initSteamInstalledPath(); void initSteamInstalledPath();
QString fixLanguageCode(const QString& languageCode); QString fixLanguageCode(const QString& languageCode);
@ -192,5 +194,7 @@ private:
QString m_font { "Roboto" }; QString m_font { "Roboto" };
QString m_decoder; QString m_decoder;
QString m_buildInfos; QString m_buildInfos;
QVersionNumber m_profilesVersion { 2, 0, 0 };
}; };
} }

View File

@ -1,16 +1,19 @@
{ {
"version":"1.0.0", "profiles": [
"profilesWallpaper":[ {
"appdrawer": [],
], "name": "default",
"profilesWidgets":[ "timelineWallpaper": [
{ {
"name": "default",
} "startTime": "00:00:00",
], "endTime": "23:59:59",
"profilesAppDrawer":[ "wallpaper": [
{ ]
}
} ],
] "widgets": []
}
],
"version": "2.0.0"
} }

View File

@ -14,6 +14,11 @@ Control {
leftPadding: 20 leftPadding: 20
rightPadding: 20 rightPadding: 20
property int activeTimelineIndex: 0
function getActiveTimeline(){
return timeLine.sectionsList[root.activeTimelineIndex]
}
function removeAll(){ function removeAll(){
timeLine.removeAll() timeLine.removeAll()
@ -162,14 +167,15 @@ Control {
App.screenPlayManager.moveTimelineAt(section.index, section.identifier, lineHandle.linePosition, lineHandle.timeString) App.screenPlayManager.moveTimelineAt(section.index, section.identifier, lineHandle.linePosition, lineHandle.timeString)
} }
function lineIndicatorSelected(selectedIndicatorindex) { function lineIndicatorSelected(activeTimelineIndex) {
for (let i = 0; i < timeLine.sectionsList.length; i++) { for (let i = 0; i < timeLine.sectionsList.length; i++) {
if (i === selectedIndicatorindex) { if (i === activeTimelineIndex) {
timeLine.sectionsList[i].lineIndicator.selected = true timeLine.sectionsList[i].lineIndicator.selected = true
continue continue
} }
timeLine.sectionsList[i].lineIndicator.selected = false timeLine.sectionsList[i].lineIndicator.selected = false
} }
root.activeTimelineIndex = activeTimelineIndex
} }
// We must update all indexes when removing/adding an element // We must update all indexes when removing/adding an element

View File

@ -6,7 +6,6 @@ import QtQuick.Dialogs
import QtQuick.Controls.Material import QtQuick.Controls.Material
import QtQuick.Controls.Material.impl import QtQuick.Controls.Material.impl
import ScreenPlayApp import ScreenPlayApp
import ScreenPlayUtil import ScreenPlayUtil
import "../Monitors" import "../Monitors"
import "../Components" import "../Components"
@ -381,19 +380,16 @@ Drawer {
return return
} }
const activeTimeline = timeline.getActiveTimeline()
const screenFile = item.m_file const screenFile = item.m_file
const playbackRate = 1 const playbackRate = 1
const jsonProperties = {} const jsonProperties = {}
const timelineIndex = 0 let success = App.screenPlayManager.setWallpaperAtTimelineIndex(
const startTimeString = 0
const endTimeString = 0
let success = App.screenPlayManager.addWallpaperAtTimelineIndex(
root.type, cbVideoFillMode.currentValue, root.type, cbVideoFillMode.currentValue,
absoluteStoragePath, previewImage, screenFile, absoluteStoragePath, previewImage, screenFile,
activeMonitors, volume, playbackRate, jsonProperties, activeMonitors, volume, playbackRate, jsonProperties,
timelineIndex, activeTimeline.activeTimelineIndex,
startTimeString, activeTimeline.identifier,
endTimeString,
true) true)
} }
if (App.util.isWidget(root.type)) if (App.util.isWidget(root.type))

View File

@ -37,7 +37,7 @@ namespace ScreenPlay {
*/ */
/*! /*!
\brief Constructor when loading properties from settings.json \brief Constructor when loading properties from profiles.json
We need to _flatten_ the json to make it work with a flat list model! We need to _flatten_ the json to make it work with a flat list model!
See \sa getActiveSettingsJson to make the flat list to a hierarchical json object See \sa getActiveSettingsJson to make the flat list to a hierarchical json object
*/ */

View File

@ -56,6 +56,7 @@ std::shared_ptr<WallpaperTimelineSection> ScreenPlayManager::findActiveSection()
} }
return nullptr; // No active section contains the current time return nullptr; // No active section contains the current time
} }
/*! /*!
\brief Checks if we need to display a different wallpaper at the current time. \brief Checks if we need to display a different wallpaper at the current time.
*/ */
@ -92,10 +93,6 @@ void ScreenPlayManager::checkActiveWallpaperTimeline()
// TODO: Check if we can reuse some active wallpaper // TODO: Check if we can reuse some active wallpaper
} }
bool ScreenPlayManager::removeWallpaperAtTimelineIndex(const int timelineIndex, const int monitorIndex)
{
return {};
}
/*! /*!
\brief Qml function, because we cannot create the WallpaperData in qml. \brief Qml function, because we cannot create the WallpaperData in qml.
@ -111,8 +108,7 @@ bool ScreenPlayManager::setWallpaperAtTimelineIndex(
const float playbackRate, const float playbackRate,
const QJsonObject& properties, const QJsonObject& properties,
const int timelineIndex, const int timelineIndex,
const QString& startTimeString, const QString& identifier,
const QString& endTimeString,
const bool saveToProfilesConfigFile) const bool saveToProfilesConfigFile)
{ {
WallpaperData wallpaperData; WallpaperData wallpaperData;
@ -126,12 +122,16 @@ bool ScreenPlayManager::setWallpaperAtTimelineIndex(
wallpaperData.playbackRate = playbackRate; wallpaperData.playbackRate = playbackRate;
wallpaperData.properties = properties; wallpaperData.properties = properties;
const QTime startTime = QTime::fromString(startTimeString, m_timelineTimeFormat); for (auto& timelineSection : m_wallpaperTimelineSectionsList) {
const QTime endTime = QTime::fromString(startTimeString, m_timelineTimeFormat); const bool sameIndex = timelineSection->index == timelineIndex;
const bool sameIdentifier = timelineSection->identifier == identifier;
if (!startTime.isValid() || !endTime.isValid()) { if(sameIndex && sameIdentifier){
qWarning() << "Invalid time, startTime: " << startTime << " endTime " << endTime; // TODO vec
return false; timelineSection->wallpaperData = {wallpaperData};
break;
} else if(sameIdentifier || sameIdentifier){
qCritical()<< "Invalid";
}
} }
auto wallpaper = startWallpaper( auto wallpaper = startWallpaper(
@ -158,7 +158,7 @@ void ScreenPlayManager::init(
// the existing one // the existing one
if (!loadProfiles()) { if (!loadProfiles()) {
qInfo() << "Reset default profiles.json at:" << m_globalVariables->localSettingsPath(); qInfo() << "Reset default profiles.json at:" << m_globalVariables->localSettingsPath();
m_settings->writeJsonFileFromResource("profiles"); m_settings->writeDefaultProfiles();
} }
} }
@ -438,6 +438,209 @@ ScreenPlayWallpaper* ScreenPlayManager::getWallpaperByAppID(const QString& appID
return nullptr; return nullptr;
} }
// We always handle the endTimeString, because it is the handle for the
// timeline. The last, default, timeline does not have a handle.
bool ScreenPlayManager::moveTimelineAt(const int index, const QString identifier, const float relativePosition, QString positionTimeString)
{
m_contentTimer.stop();
auto updateTimer = qScopeGuard([this] { m_contentTimer.start(); });
auto& wallpapterTimelineSection = m_wallpaperTimelineSectionsList.at(index);
QTime newPositionTime = QTime::fromString(positionTimeString, "hh:mm");
if (!newPositionTime.isValid()) {
qWarning() << "Unable to move with invalid time:" << positionTimeString;
return false;
}
wallpapterTimelineSection->endTime = newPositionTime;
wallpapterTimelineSection->relativePosition = relativePosition;
// We set the identifier here, because we generate it in qml
// The identiefier is only used for debugging
wallpapterTimelineSection->identifier = identifier;
const auto timelineCount = m_wallpaperTimelineSectionsList.size();
// Only update the next timeline startTime
// if we are not end last wallpaper, that always
// must end at 24:00
if (index <= timelineCount) {
auto& wallpapterTimelineSectionNext = m_wallpaperTimelineSectionsList.at(index + 1);
wallpapterTimelineSectionNext->startTime = newPositionTime;
}
printTimelines();
return true;
}
QString ScreenPlayManager::getTimeString(double relativeLinePosition)
{
const double totalHours = relativeLinePosition * 24;
int hours = static_cast<int>(std::floor(totalHours)); // Gets the whole hour part
double fractionalHours = totalHours - hours;
int minutes = static_cast<int>(std::floor(fractionalHours * 60)); // Calculates the minutes
double fractionalMinutes = fractionalHours * 60 - minutes;
int seconds = static_cast<int>(std::round(fractionalMinutes * 60)); // Calculates the seconds
// Adjust minutes and seconds if seconds rolled over to 60
if (seconds == 60) {
seconds = 0;
minutes += 1;
}
// Adjust hours and minutes if minutes rolled over to 60
if (minutes == 60) {
minutes = 0;
hours += 1;
}
// Ensure hours wrap correctly at 24
if (hours == 24) {
hours = 0;
}
// Format the output to "HH:MM:SS"
return QString("%1:%2:%3").arg(hours, 2, 10, QChar('0')).arg(minutes, 2, 10, QChar('0')).arg(seconds, 2, 10, QChar('0'));
}
void ScreenPlayManager::updateIndices()
{
// Sort the vector based on startTime
std::sort(m_wallpaperTimelineSectionsList.begin(), m_wallpaperTimelineSectionsList.end(),
[](const auto& a, const auto& b) {
return a->startTime < b->startTime;
});
// Update the indices based on new order
for (int i = 0; i < m_wallpaperTimelineSectionsList.size(); ++i) {
m_wallpaperTimelineSectionsList[i]->index = i;
}
}
bool ScreenPlayManager::addTimelineAt(const int index, const float reltiaveLinePosition, QString identifier)
{
m_contentTimer.stop();
auto updateTimer = qScopeGuard([this] { m_contentTimer.start(); });
// We always get the new endTime
const QString newStopPosition = getTimeString(reltiaveLinePosition);
QTime newStopPositionTime = QTime::fromString(newStopPosition, m_timelineTimeFormat);
if (!newStopPositionTime.isValid()) {
return false;
}
// IMPORTANT: The new element is always on the left. The first
// handle always persists because the
// user can never delete it. It only gets "pushed" further
// to the right, by increasing the size.
// | Insert here
// ˇ
// |-----------------------------------------------|
// 0 ID: AAA
//
//
// |-----------------------|-----------------------|
// 0 ID: BBB 1 - ID: AAA
// We directly get the new index of 0 in this example from qml
auto newTimelineSection = std::make_shared<WallpaperTimelineSection>();
newTimelineSection->index = index;
newTimelineSection->identifier = identifier;
newTimelineSection->endTime = newStopPositionTime;
// We can use the given index here, because it points
// the the current item at that index, and we have not yet
// added our new timelineSection to our list.
newTimelineSection->startTime = m_wallpaperTimelineSectionsList.at(index)->startTime;
const bool isLast = (m_wallpaperTimelineSectionsList.length() - 1) == index;
if(isLast){
m_wallpaperTimelineSectionsList.last()->startTime = newTimelineSection->endTime;
}
m_wallpaperTimelineSectionsList.append(newTimelineSection);
updateIndices();
printTimelines();
return true;
}
bool ScreenPlayManager::removeTimelineAt(const int index)
{
printTimelines();
const auto timelineCount = m_wallpaperTimelineSectionsList.size();
if (timelineCount == 0) {
qCritical() << "Timeline empty";
return false;
}
if (timelineCount == 1) {
qCritical() << "Timeline must always have at least one element, that span across the whole timeline from 00:00:00 to 23:59:59.";
return false;
}
m_contentTimer.stop();
auto updateTimer = qScopeGuard([this] { m_contentTimer.start(); });
auto& wallpapterTimelineSection = m_wallpaperTimelineSectionsList.at(index);
// When we have two timelines, we know that only the first
// timeline can be removed and the second one will then span
// across the whole timeline
// remove <- expand
// |-----------|-----------|
// 0 1
if (timelineCount == 2) {
if (index != 0) {
qCritical() << "Removing the last timeline is not allowed. This must always span the whole timeline";
return false;
}
m_wallpaperTimelineSectionsList.removeAt(index);
m_wallpaperTimelineSectionsList.first()->startTime = QTime::fromString("00:00:00", m_timelineTimeFormat);
updateIndices();
printTimelines();
return true;
}
// Now handle all states where we have more than two wallpaper
// There is no timeline before if we want to remove
// the timeline at index 0. We do not need to make the same
// check for the timelineAfter, because the last timeline
// cannot be deleted
QTime endTime;
if(index == 0){
endTime = QTime::fromString("00:00:00", m_timelineTimeFormat);
}else {
endTime = m_wallpaperTimelineSectionsList.at(index - 1)->endTime;
}
auto timelineAfter = m_wallpaperTimelineSectionsList.at(index + 1);
// before remove <- expand
// |-----------|-----------|-----------|
// 0 1 2
// Now when removing timeline at index 1, the next (after)
// wallpaper gets the remaining space
timelineAfter->startTime = endTime;
m_wallpaperTimelineSectionsList.removeAt(index);
updateIndices();
printTimelines();
return true;
printTimelines();
return true;
}
void ScreenPlayManager::printTimelines()
{
std::cout << "#############################\n";
for (auto& timeline : m_wallpaperTimelineSectionsList) {
std::cout <<timeline->index << ": " << timeline->identifier.toStdString() << "\t" << timeline->relativePosition << " start: " << timeline->startTime.toString().toStdString() << " end: " << timeline->endTime.toString().toStdString() << std::endl;
}
}
QVariantMap ScreenPlayManager::initialStopPositions()
{
QVariantMap sectionPositions;
for (const auto& timelineSection : m_wallpaperTimelineSectionsList) {
sectionPositions.insert({timelineSection->identifier},{timelineSection->relativePosition});
}
return sectionPositions;
}
/*! /*!
\brief Appends a new SDKConnection object shared_ptr to the m_clients list. \brief Appends a new SDKConnection object shared_ptr to the m_clients list.
*/ */
@ -637,7 +840,7 @@ bool ScreenPlayManager::loadProfiles()
} }
std::optional<QVersionNumber> version = util.getVersionNumberFromString(configObj->value("version").toString()); std::optional<QVersionNumber> version = util.getVersionNumberFromString(configObj->value("version").toString());
QVersionNumber requiredVersion { 1, 0, 0 }; QVersionNumber requiredVersion = m_settings->getProfilesVersion();
if (version && *version != requiredVersion) { if (version && *version != requiredVersion) {
qWarning() << "Version missmatch fileVersion: " << version->toString() << "m_version: " << requiredVersion.toString(); qWarning() << "Version missmatch fileVersion: " << version->toString() << "m_version: " << requiredVersion.toString();
return false; return false;
@ -697,7 +900,7 @@ bool ScreenPlayManager::loadProfiles()
} }
// The can happen if the user unpluggs a wallpaper but it still exists // The can happen if the user unpluggs a wallpaper but it still exists
// in the settings.json. For this we save all profiles with now active // in the profiles.json. For this we save all profiles with now active
// content. // content.
if (containsInvalidData) if (containsInvalidData)
saveProfiles(); saveProfiles();

View File

@ -98,43 +98,73 @@ Settings::Settings(const std::shared_ptr<GlobalVariables>& globalVariables,
setAnonymousTelemetry(m_qSettings.value("AnonymousTelemetry", true).toBool()); setAnonymousTelemetry(m_qSettings.value("AnonymousTelemetry", true).toBool());
// Wallpaper and Widgets config
QFile profilesFile(m_globalVariables->localSettingsPath().toString() + "/profiles.json");
if (!profilesFile.exists()) { initProfilesSettings();
qInfo("No profiles.json found, creating default profiles.json");
writeJsonFileFromResource("profiles");
}
initInstalledPath(); initInstalledPath();
setupWidgetAndWindowPaths(); setupWidgetAndWindowPaths();
} }
/*! /*!
\brief Writes the default JsonFile from the resources and the given \a filename. Currently we have two default json files: \brief Writes the default profiles json if we do not have any or we do have a major
\list version bump. We delete the old config for now.
\li profiles.json
\li settings.json
\endlist
*/ */
void Settings::writeJsonFileFromResource(const QString& filename) void Settings::initProfilesSettings()
{ {
QFile file(m_globalVariables->localSettingsPath().toString() + "/" + filename + ".json"); const QString defaultProfilesFilePath = m_globalVariables->localSettingsPath().toString() + "/profiles.json";
// Wallpaper and Widgets config
QFile profilesFile(defaultProfilesFilePath);
if (!profilesFile.exists()) {
qInfo("No profiles.json found, creating default profiles.json");
return writeDefaultProfiles();
}
profilesFile.close();
// TODO version check
const auto jsonObjOpt = Util().openJsonFileToObject(defaultProfilesFilePath);
if (jsonObjOpt.has_value()) {
const QJsonObject profilesSettings = jsonObjOpt.value();
if(!profilesSettings.contains("version"))
return writeDefaultProfiles();
const auto profilesSettingsVersion = QVersionNumber::fromString(profilesSettings.value("version").toString());
if(profilesSettingsVersion.isNull())
return writeDefaultProfiles();
if(profilesSettingsVersion < m_profilesVersion)
return writeDefaultProfiles();
}
}
void Settings::writeDefaultProfiles(){
QFileInfo fileInfo(m_globalVariables->localSettingsPath().toString() + "/profiles.json");
QFile profilesFile(fileInfo.absoluteFilePath());
qInfo() << "Writing default profiles config to: " << fileInfo.absoluteFilePath();
QDir directory(m_globalVariables->localSettingsPath().toString()); QDir directory(m_globalVariables->localSettingsPath().toString());
if (!directory.exists()) { if (!directory.exists()) {
directory.mkpath(directory.path()); directory.mkpath(directory.path());
} }
QFile defaultSettings(":/qml/ScreenPlayApp/" + filename + ".json"); QFile defaultProfileFile(":/qml/ScreenPlayApp/profiles.json");
file.open(QIODevice::WriteOnly | QIODevice::Text); profilesFile.open(QIODevice::WriteOnly | QIODevice::Text);
defaultSettings.open(QIODevice::ReadOnly | QIODevice::Text); defaultProfileFile.open(QIODevice::ReadOnly | QIODevice::Text);
QTextStream out(&file); QTextStream out(&profilesFile);
QTextStream defaultOut(&defaultSettings); QTextStream defaultOut(&defaultProfileFile);
out << defaultOut.readAll(); out << defaultOut.readAll();
file.close(); profilesFile.close();
defaultSettings.close(); defaultProfileFile.close();
}
QVersionNumber Settings::getProfilesVersion() const
{
return m_profilesVersion;
} }
/*! /*!
@ -190,21 +220,6 @@ void Settings::setupWidgetAndWindowPaths()
} }
} }
/*!
\brief When no default language is set in the registry we check the system set language. If there is no
matching translation is available we set it to english. This function gets called from the UI when
the user manually changes the language.
*/
void Settings::restoreDefault(const QString& appConfigLocation, const QString& settingsFileType)
{
QString fullSettingsPath { appConfigLocation + "/" + settingsFileType + ".json" };
qWarning() << "Unable to load config from " << fullSettingsPath
<< ". Restoring default!";
QFile file { fullSettingsPath };
file.remove();
writeJsonFileFromResource(settingsFileType);
}
void Settings::initInstalledPath() void Settings::initInstalledPath()
{ {
const QString contentPath = m_qSettings.value("ScreenPlayContentPath", "").toString(); const QString contentPath = m_qSettings.value("ScreenPlayContentPath", "").toString();

View File

@ -48,5 +48,5 @@
"widgets": [] "widgets": []
} }
], ],
"version": "1.0.0" "version": "2.0.0"
} }