mirror of
https://gitlab.com/kelteseth/ScreenPlay.git
synced 2024-11-22 10:42:29 +01:00
Change all plugins to be QML_ELEMENT
Add ScreenPlayWeather
This commit is contained in:
parent
1d81117f6e
commit
fb5d6581ec
@ -1,9 +1,7 @@
|
|||||||
project(CMake)
|
project(CMake)
|
||||||
|
|
||||||
set(FILES # cmake-format: sortable
|
set(FILES # cmake-format: sortable
|
||||||
CopyRecursive.cmake
|
CopyRecursive.cmake CreateIFWInstaller.cmake FetchContentThirdParty.cmake QtUpdateTranslations.cmake)
|
||||||
CreateIFWInstaller.cmake
|
|
||||||
QtUpdateTranslations.cmake)
|
|
||||||
|
|
||||||
add_custom_target(
|
add_custom_target(
|
||||||
${PROJECT_NAME}
|
${PROJECT_NAME}
|
||||||
|
11
CMake/FetchContentThirdParty.cmake
Normal file
11
CMake/FetchContentThirdParty.cmake
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.16.0)
|
||||||
|
|
||||||
|
include(FetchContent)
|
||||||
|
|
||||||
|
FetchContent_Declare(
|
||||||
|
qml-plausible
|
||||||
|
GIT_REPOSITORY https://gitlab.com/kelteseth/qml-plausible.git
|
||||||
|
GIT_TAG 00398446c7a2882a11d34c007a1ed8205c72e123
|
||||||
|
)
|
||||||
|
|
||||||
|
FetchContent_MakeAvailable(qml-plausible)
|
@ -84,8 +84,10 @@ add_subdirectory(ScreenPlayShader)
|
|||||||
add_subdirectory(ScreenPlayWallpaper)
|
add_subdirectory(ScreenPlayWallpaper)
|
||||||
add_subdirectory(ScreenPlayWidget)
|
add_subdirectory(ScreenPlayWidget)
|
||||||
add_subdirectory(ScreenPlayUtil)
|
add_subdirectory(ScreenPlayUtil)
|
||||||
|
add_subdirectory(ScreenPlayWeather)
|
||||||
add_subdirectory(CMake)
|
add_subdirectory(CMake)
|
||||||
add_subdirectory(Tools)
|
add_subdirectory(Tools)
|
||||||
|
include(${CMAKE_CURRENT_SOURCE_DIR}/CMake/FetchContentThirdParty.cmake)
|
||||||
|
|
||||||
if(${SCREENPLAY_STEAM})
|
if(${SCREENPLAY_STEAM})
|
||||||
add_subdirectory(ScreenPlayWorkshop)
|
add_subdirectory(ScreenPlayWorkshop)
|
||||||
@ -114,4 +116,3 @@ message(STATUS "[PROJECT] CMAKE_VERSION = ${CMAKE_VERSION}")
|
|||||||
if(${SCREENPLAY_CREATE_INSTALLER})
|
if(${SCREENPLAY_CREATE_INSTALLER})
|
||||||
include(${CMAKE_CURRENT_SOURCE_DIR}/CMake/CreateIFWInstaller.cmake)
|
include(${CMAKE_CURRENT_SOURCE_DIR}/CMake/CreateIFWInstaller.cmake)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
10
Common/CMakeLists.txt
Normal file
10
Common/CMakeLists.txt
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.16.0)
|
||||||
|
|
||||||
|
include(FetchContent)
|
||||||
|
|
||||||
|
FetchContent_Declare(
|
||||||
|
qml-plausible
|
||||||
|
GIT_REPOSITORY https://gitlab.com/kelteseth/qml-plausible.git
|
||||||
|
GIT_TAG 00398446c7a2882a11d34c007a1ed8205c72e123)
|
||||||
|
|
||||||
|
FetchContent_MakeAvailable(qml-plausible)
|
@ -180,7 +180,6 @@ find_package(
|
|||||||
qt_add_resources(RESOURCES Resources.qrc)
|
qt_add_resources(RESOURCES Resources.qrc)
|
||||||
qt_add_big_resources(FONTS fonts.qrc)
|
qt_add_big_resources(FONTS fonts.qrc)
|
||||||
|
|
||||||
|
|
||||||
add_library(ScreenPlayLib ${SOURCES} ${HEADER} ${RESOURCES} ${FONTS})
|
add_library(ScreenPlayLib ${SOURCES} ${HEADER} ${RESOURCES} ${FONTS})
|
||||||
|
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
@ -197,7 +196,8 @@ target_link_libraries(
|
|||||||
Qt6::WebSockets
|
Qt6::WebSockets
|
||||||
Qt6::Svg
|
Qt6::Svg
|
||||||
ScreenPlayQmlplugin
|
ScreenPlayQmlplugin
|
||||||
SteamSDKQtEnums)
|
SteamSDKQtEnums
|
||||||
|
Plausibleplugin)
|
||||||
|
|
||||||
if(${TESTS_ENABLED})
|
if(${TESTS_ENABLED})
|
||||||
add_executable(tst_ScreenPlay tests/tst_main.cpp)
|
add_executable(tst_ScreenPlay tests/tst_main.cpp)
|
||||||
@ -207,27 +207,25 @@ endif()
|
|||||||
qt_add_executable(${PROJECT_NAME} main.cpp)
|
qt_add_executable(${PROJECT_NAME} main.cpp)
|
||||||
target_link_libraries(${PROJECT_NAME} PRIVATE ScreenPlayLib)
|
target_link_libraries(${PROJECT_NAME} PRIVATE ScreenPlayLib)
|
||||||
|
|
||||||
set_source_files_properties(${TS_FILES}
|
set_source_files_properties(${TS_FILES} PROPERTIES OUTPUT_LOCATION "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/translations")
|
||||||
PROPERTIES OUTPUT_LOCATION "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/translations")
|
|
||||||
|
|
||||||
# qt_add_lupdate does not work for some reason. Lets do it manually:
|
# qt_add_lupdate does not work for some reason. Lets do it manually:
|
||||||
find_program(LUPDATE_EXECUTABLE lupdate)
|
find_program(LUPDATE_EXECUTABLE lupdate)
|
||||||
foreach(_ts_file ${TS_FILES})
|
foreach(_ts_file ${TS_FILES})
|
||||||
message(STATUS "Update Translation: ${_ts_file}")
|
message(STATUS "Update Translation: ${_ts_file}")
|
||||||
execute_process(COMMAND ${LUPDATE_EXECUTABLE} -noobsolete -locations none -recursive ${CMAKE_CURRENT_SOURCE_DIR}/qml -ts ${CMAKE_CURRENT_SOURCE_DIR}/${_ts_file} OUTPUT_QUIET)
|
execute_process(COMMAND ${LUPDATE_EXECUTABLE} -noobsolete -locations none -recursive ${CMAKE_CURRENT_SOURCE_DIR}/qml -ts
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/${_ts_file} OUTPUT_QUIET)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
qt_add_lrelease(
|
qt_add_lrelease(${PROJECT_NAME} TS_FILES ${TS_FILES})
|
||||||
${PROJECT_NAME}
|
|
||||||
TS_FILES
|
|
||||||
${TS_FILES}
|
|
||||||
)
|
|
||||||
|
|
||||||
target_compile_definitions(${PROJECT_NAME} PRIVATE $<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:QT_QML_DEBUG>)
|
target_compile_definitions(${PROJECT_NAME} PRIVATE $<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:QT_QML_DEBUG>)
|
||||||
|
|
||||||
qt_add_library(ScreenPlayQml STATIC)
|
qt_add_library(ScreenPlayQml STATIC)
|
||||||
qt_add_qml_module(
|
qt_add_qml_module(
|
||||||
ScreenPlayQml
|
ScreenPlayQml
|
||||||
|
OUTPUT_DIRECTORY
|
||||||
|
${CMAKE_BINARY_DIR}/bin/ScreenPlayQml
|
||||||
URI
|
URI
|
||||||
ScreenPlayQml
|
ScreenPlayQml
|
||||||
VERSION
|
VERSION
|
||||||
|
@ -6,30 +6,63 @@ set(CMAKE_AUTOMOC ON)
|
|||||||
|
|
||||||
find_package(
|
find_package(
|
||||||
Qt6
|
Qt6
|
||||||
COMPONENTS Quick Core
|
COMPONENTS Quick Core ShaderTools
|
||||||
REQUIRED)
|
REQUIRED)
|
||||||
|
|
||||||
set(SOURCES # cmake-format: sortable
|
# Because this is a plugin, we need this for testing and development. This can be disabled when using the plugin in your project directly.
|
||||||
screenplayshader_plugin.cpp shaderlibrary.cpp)
|
option(tst_ScreenPlayShader "Builds TextProject" ON)
|
||||||
|
|
||||||
set(HEADER # cmake-format: sortable
|
set(QML_RESOURCES # cmake-format: sortable
|
||||||
screenplayshader_plugin.h shaderlibrary.h)
|
shader/lightning.frag
|
||||||
|
shader/lightning.vert
|
||||||
|
shader/water.frag
|
||||||
|
shader/water.vert
|
||||||
|
)
|
||||||
|
|
||||||
qt_add_resources(RESOURCES Resources.qrc)
|
# https://doc.qt.io/qt-6/qtshadertools-build.html
|
||||||
|
qt6_add_shaders(${PROJECT_NAME} "${PROJECT_NAME}Shaders"
|
||||||
|
PREFIX
|
||||||
|
"/shaders"
|
||||||
|
FILES
|
||||||
|
shader/lightning.frag
|
||||||
|
shader/lightning.vert
|
||||||
|
shader/water.frag
|
||||||
|
shader/water.vert
|
||||||
|
)
|
||||||
|
|
||||||
add_library(${PROJECT_NAME} SHARED ${SOURCES} ${HEADER} ${RESOURCES})
|
set(QML # cmake-format: sortable
|
||||||
|
src/ShadertoyShader.qml
|
||||||
|
src/TestMain.qml)
|
||||||
|
|
||||||
|
set(QML_PLUGIN_SOURCES # cmake-format: sortable
|
||||||
|
src/shaderlibrary.cpp)
|
||||||
|
|
||||||
|
set(QML_PLUGIN_HEADER # cmake-format: sortable
|
||||||
|
src/shaderlibrary.h)
|
||||||
|
|
||||||
|
add_library(${PROJECT_NAME} STATIC)
|
||||||
|
target_include_directories(${PROJECT_NAME} PUBLIC src/)
|
||||||
|
|
||||||
qt_add_qml_module(
|
qt_add_qml_module(
|
||||||
${PROJECT_NAME}
|
${PROJECT_NAME}
|
||||||
URI
|
URI
|
||||||
${PROJECT_NAME}
|
${PROJECT_NAME}
|
||||||
|
OUTPUT_DIRECTORY
|
||||||
|
${CMAKE_BINARY_DIR}/bin/${PROJECT_NAME}
|
||||||
VERSION
|
VERSION
|
||||||
1.0
|
1.0
|
||||||
QML_FILES
|
QML_FILES
|
||||||
ShadertoyShader.qml)
|
${QML}
|
||||||
|
SOURCES
|
||||||
target_include_directories(${PROJECT_NAME} PRIVATE inc)
|
${QML_PLUGIN_SOURCES}
|
||||||
|
${QML_PLUGIN_HEADER}
|
||||||
target_compile_definitions(${PROJECT_NAME} PRIVATE $<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:QT_QML_DEBUG>)
|
RESOURCES
|
||||||
|
${QML_RESOURCES})
|
||||||
|
|
||||||
target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Core Qt6::Quick Qt6::Gui)
|
target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Core Qt6::Quick Qt6::Gui)
|
||||||
|
|
||||||
|
if(${tst_ScreenPlayShader})
|
||||||
|
qt_add_executable(tst_ScreenPlayShader src/TestMain.cpp)
|
||||||
|
target_link_libraries(tst_ScreenPlayShader PRIVATE Qt6::Quick ${PROJECT_NAME}plugin)
|
||||||
|
target_compile_definitions(tst_ScreenPlayShader PRIVATE $<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:QT_QML_DEBUG>)
|
||||||
|
endif()
|
||||||
|
@ -1,14 +0,0 @@
|
|||||||
<RCC>
|
|
||||||
<qresource prefix="/">
|
|
||||||
<file>lightning.frag</file>
|
|
||||||
<file>lightning.vert</file>
|
|
||||||
<file>water.frag</file>
|
|
||||||
<file>water.vert</file>
|
|
||||||
<file>assets/Shadertoy_Bayer.png</file>
|
|
||||||
<file>assets/Shadertoy_Gray_Noise_Medium.png</file>
|
|
||||||
<file>assets/Shadertoy_Lichen.jpg</file>
|
|
||||||
</qresource>
|
|
||||||
<qresource prefix="/ShaderWrapper">
|
|
||||||
<file>ShadertoyShader.qml</file>
|
|
||||||
</qresource>
|
|
||||||
</RCC>
|
|
@ -1,18 +0,0 @@
|
|||||||
#include "screenplayshader_plugin.h"
|
|
||||||
|
|
||||||
#include <QQmlEngine>
|
|
||||||
#include <QUrl>
|
|
||||||
#include <qqml.h>
|
|
||||||
|
|
||||||
QObject* ScreenPlayShaderLibrarySingleton(QQmlEngine* engine, QJSEngine* scriptEngine)
|
|
||||||
{
|
|
||||||
Q_UNUSED(scriptEngine)
|
|
||||||
return new ShaderLibrary();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScreenPlayShaderPlugin::registerTypes(const char* uri)
|
|
||||||
{
|
|
||||||
|
|
||||||
qmlRegisterType(QUrl("qrc:/ShaderWrapper/ShadertoyShader.qml"), "ScreenPlay.ShadertoyShader", 1, 0, "ShadertoyShader");
|
|
||||||
qmlRegisterSingletonType<ShaderLibrary>(uri, 1, 0, "ShaderLibrary", ScreenPlayShaderLibrarySingleton);
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <QQmlExtensionPlugin>
|
|
||||||
|
|
||||||
#include "shaderlibrary.h"
|
|
||||||
|
|
||||||
class ScreenPlayShaderPlugin : public QQmlExtensionPlugin {
|
|
||||||
Q_OBJECT
|
|
||||||
Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)
|
|
||||||
|
|
||||||
public:
|
|
||||||
void registerTypes(const char* uri) override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
ShaderLibrary m_shaderLibrary;
|
|
||||||
};
|
|
26
ScreenPlayShader/src/TestMain.cpp
Normal file
26
ScreenPlayShader/src/TestMain.cpp
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#include <QGuiApplication>
|
||||||
|
#include <QQmlApplicationEngine>
|
||||||
|
#include <QVersionNumber>
|
||||||
|
#include <QtQml/qqmlextensionplugin.h>
|
||||||
|
|
||||||
|
Q_IMPORT_QML_PLUGIN(ScreenPlayShaderPlugin)
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
QGuiApplication app(argc, argv);
|
||||||
|
|
||||||
|
QQmlApplicationEngine engine;
|
||||||
|
// The first subfolder is the libraryName followed by the regular
|
||||||
|
// folder strucutre: LibararyName/Subfolder
|
||||||
|
const QUrl url(u"qrc:/ScreenPlayShader/src/TestMain.qml"_qs);
|
||||||
|
QObject::connect(
|
||||||
|
&engine, &QQmlApplicationEngine::objectCreated,
|
||||||
|
&app, [url](QObject* obj, const QUrl& objUrl) {
|
||||||
|
if (!obj && url == objUrl)
|
||||||
|
QCoreApplication::exit(-1);
|
||||||
|
},
|
||||||
|
Qt::QueuedConnection);
|
||||||
|
engine.load(url);
|
||||||
|
|
||||||
|
return app.exec();
|
||||||
|
}
|
16
ScreenPlayShader/src/TestMain.qml
Normal file
16
ScreenPlayShader/src/TestMain.qml
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import QtQuick
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import QtQuick.Controls
|
||||||
|
import QtQuick.Controls.Material
|
||||||
|
import ScreenPlayShader 1.0
|
||||||
|
|
||||||
|
Window {
|
||||||
|
id: root
|
||||||
|
width: 1366
|
||||||
|
height: 768
|
||||||
|
visible: true
|
||||||
|
title: qsTr("ScreenPlayShader")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -21,15 +21,15 @@
|
|||||||
ShaderLibrary::ShaderLibrary(QQuickItem* parent)
|
ShaderLibrary::ShaderLibrary(QQuickItem* parent)
|
||||||
: QQuickItem(parent)
|
: QQuickItem(parent)
|
||||||
{
|
{
|
||||||
QFile lightningFragFile(":/lightning.frag");
|
QFile lightningFragFile("qrc:/ScreenPlaySysInfo/src/lightning.frag");
|
||||||
lightningFragFile.open(QIODevice::ReadOnly);
|
lightningFragFile.open(QIODevice::ReadOnly);
|
||||||
QFile lightningVertFile(":/lightning.vert");
|
QFile lightningVertFile("qrc:/ScreenPlaySysInfo/src/lightning.vert");
|
||||||
lightningVertFile.open(QIODevice::ReadOnly);
|
lightningVertFile.open(QIODevice::ReadOnly);
|
||||||
m_lightning = std::make_unique<Shader>(lightningVertFile.readAll(), lightningFragFile.readAll());
|
m_lightning = std::make_unique<Shader>(lightningVertFile.readAll(), lightningFragFile.readAll());
|
||||||
|
|
||||||
QFile waterFragFile(":/water.frag");
|
QFile waterFragFile("qrc:/ScreenPlaySysInfo/src/water.frag");
|
||||||
waterFragFile.open(QIODevice::ReadOnly);
|
waterFragFile.open(QIODevice::ReadOnly);
|
||||||
QFile waterVertFile(":/water.vert");
|
QFile waterVertFile("qrc:/ScreenPlaySysInfo/src/water.vert");
|
||||||
waterVertFile.open(QIODevice::ReadOnly);
|
waterVertFile.open(QIODevice::ReadOnly);
|
||||||
m_water = std::make_unique<Shader>(waterVertFile.readAll(), waterFragFile.readAll());
|
m_water = std::make_unique<Shader>(waterVertFile.readAll(), waterFragFile.readAll());
|
||||||
}
|
}
|
@ -4,6 +4,7 @@
|
|||||||
#include <QQuickItem>
|
#include <QQuickItem>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <QQmlEngine>
|
||||||
|
|
||||||
class Shader : public QObject {
|
class Shader : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@ -63,6 +64,7 @@ class ShaderLibrary : public QQuickItem {
|
|||||||
|
|
||||||
Q_PROPERTY(Shader* lightning READ lightning WRITE setLightning NOTIFY lightningChanged)
|
Q_PROPERTY(Shader* lightning READ lightning WRITE setLightning NOTIFY lightningChanged)
|
||||||
Q_PROPERTY(Shader* water READ water WRITE setWater NOTIFY waterChanged)
|
Q_PROPERTY(Shader* water READ water WRITE setWater NOTIFY waterChanged)
|
||||||
|
QML_ELEMENT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit ShaderLibrary(QQuickItem* parent = nullptr);
|
explicit ShaderLibrary(QQuickItem* parent = nullptr);
|
@ -1,7 +1,10 @@
|
|||||||
project(ScreenPlaySysInfo LANGUAGES CXX)
|
project(
|
||||||
|
ScreenPlaySysInfo
|
||||||
|
VERSION 0.1
|
||||||
|
LANGUAGES CXX)
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 20)
|
set(CMAKE_CXX_STANDARD 20)
|
||||||
set(CMAKE_AUTORCC ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
set(CMAKE_AUTOMOC ON)
|
set(CMAKE_AUTOMOC ON)
|
||||||
|
|
||||||
find_package(infoware CONFIG REQUIRED)
|
find_package(infoware CONFIG REQUIRED)
|
||||||
@ -11,38 +14,46 @@ find_package(
|
|||||||
COMPONENTS Quick Core
|
COMPONENTS Quick Core
|
||||||
REQUIRED)
|
REQUIRED)
|
||||||
|
|
||||||
set(SOURCES
|
# Because this is a plugin, we need this for testing and development. This can be disabled when using the plugin in your project directly.
|
||||||
# cmake-format: sortable
|
option(tst_ScreenPlaySysInfo "Builds TextProject" ON)
|
||||||
screenplaysysinfo_plugin.cpp
|
|
||||||
sysinfo.cpp
|
|
||||||
cpu.cpp
|
|
||||||
ram.cpp
|
|
||||||
storage.cpp
|
|
||||||
uptime.cpp
|
|
||||||
gpu.cpp)
|
|
||||||
|
|
||||||
set(HEADER
|
set(QML # cmake-format: sortable
|
||||||
# cmake-format: sortable
|
src/TestMain.qml)
|
||||||
screenplaysysinfo_plugin.h
|
|
||||||
sysinfo.h
|
set(QML_PLUGIN_SOURCES # cmake-format: sortable
|
||||||
cpu.h
|
src/sysinfo.cpp src/cpu.cpp src/ram.cpp src/storage.cpp src/uptime.cpp src/gpu.cpp)
|
||||||
ram.h
|
|
||||||
mathhelper.h
|
set(QML_PLUGIN_HEADER
|
||||||
storage.h
|
# cmake-format: sortable
|
||||||
uptime.h
|
src/sysinfo.h
|
||||||
gpu.h)
|
src/cpu.h
|
||||||
|
src/ram.h
|
||||||
|
src/mathhelper.h
|
||||||
|
src/storage.h
|
||||||
|
src/uptime.h
|
||||||
|
src/gpu.h)
|
||||||
|
|
||||||
|
add_library(${PROJECT_NAME} STATIC)
|
||||||
|
target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Core Qt6::Quick infoware)
|
||||||
|
target_include_directories(${PROJECT_NAME} PUBLIC src/)
|
||||||
|
|
||||||
add_library(${PROJECT_NAME} SHARED ${SOURCES} ${HEADER})
|
|
||||||
|
|
||||||
qt_add_qml_module(
|
qt_add_qml_module(
|
||||||
${PROJECT_NAME}
|
${PROJECT_NAME}
|
||||||
OUTPUT_DIRECTORY
|
|
||||||
${CMAKE_BINARY_DIR}/bin/SysInfo
|
|
||||||
URI
|
URI
|
||||||
${PROJECT_NAME}
|
${PROJECT_NAME}
|
||||||
VERSION
|
VERSION
|
||||||
1.0)
|
1.0
|
||||||
|
OUTPUT_DIRECTORY
|
||||||
|
${CMAKE_BINARY_DIR}/bin/${PROJECT_NAME}
|
||||||
|
QML_FILES
|
||||||
|
${QML}
|
||||||
|
SOURCES
|
||||||
|
${QML_PLUGIN_SOURCES}
|
||||||
|
${QML_PLUGIN_HEADER})
|
||||||
|
|
||||||
target_compile_definitions(${PROJECT_NAME} PRIVATE $<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:QT_QML_DEBUG>)
|
if(${tst_ScreenPlaySysInfo})
|
||||||
|
qt_add_executable(tst_ScreenPlaySysInfo src/TestMain.cpp)
|
||||||
target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Core Qt6::Quick infoware)
|
target_link_libraries(tst_ScreenPlaySysInfo PRIVATE Qt6::Quick ${PROJECT_NAME}plugin)
|
||||||
|
target_compile_definitions(tst_ScreenPlaySysInfo PRIVATE $<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:QT_QML_DEBUG>)
|
||||||
|
endif()
|
||||||
|
@ -1,18 +0,0 @@
|
|||||||
#include "screenplaysysinfo_plugin.h"
|
|
||||||
#include "sysinfo.h"
|
|
||||||
#include <qmetatype.h>
|
|
||||||
#include <qqml.h>
|
|
||||||
|
|
||||||
QObject* ScreenPlaySysInfoSingleton(QQmlEngine* engine, QJSEngine* scriptEngine)
|
|
||||||
{
|
|
||||||
Q_UNUSED(engine)
|
|
||||||
Q_UNUSED(scriptEngine)
|
|
||||||
|
|
||||||
return new SysInfo();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScreenPlaySysInfoPlugin::registerTypes(const char* uri)
|
|
||||||
{
|
|
||||||
// @uri ScreenPlay.Sysinfo
|
|
||||||
qmlRegisterSingletonType<SysInfo>(uri, 1, 0, "SysInfo", ScreenPlaySysInfoSingleton);
|
|
||||||
}
|
|
@ -1,45 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2020 Elias Steurer (Kelteseth)
|
|
||||||
** Contact: https://screen-play.app
|
|
||||||
**
|
|
||||||
** This file is part of ScreenPlay. ScreenPlay is licensed under a dual license in
|
|
||||||
** order to ensure its sustainability. When you contribute to ScreenPlay
|
|
||||||
** you accept that your work will be available under the two following licenses:
|
|
||||||
**
|
|
||||||
** $SCREENPLAY_BEGIN_LICENSE$
|
|
||||||
**
|
|
||||||
** #### Affero General Public License Usage (AGPLv3)
|
|
||||||
** Alternatively, this file may be used under the terms of the GNU Affero
|
|
||||||
** General Public License version 3 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file "ScreenPlay License.md" included in the
|
|
||||||
** packaging of this App. Please review the following information to
|
|
||||||
** ensure the GNU Affero Lesser General Public License version 3 requirements
|
|
||||||
** will be met: https://www.gnu.org/licenses/agpl-3.0.en.html.
|
|
||||||
**
|
|
||||||
** #### Commercial License
|
|
||||||
** This code is owned by Elias Steurer. By changing/adding to the code you agree to the
|
|
||||||
** terms written in:
|
|
||||||
** * Legal/corporate_contributor_license_agreement.md - For corporate contributors
|
|
||||||
** * Legal/individual_contributor_license_agreement.md - For individual contributors
|
|
||||||
**
|
|
||||||
** #### Additional Limitations to the AGPLv3 and Commercial Lincese
|
|
||||||
** This License does not grant any rights in the trademarks,
|
|
||||||
** service marks, or logos.
|
|
||||||
**
|
|
||||||
**
|
|
||||||
** $SCREENPLAY_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <QQmlExtensionPlugin>
|
|
||||||
|
|
||||||
class ScreenPlaySysInfoPlugin : public QQmlExtensionPlugin {
|
|
||||||
Q_OBJECT
|
|
||||||
Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)
|
|
||||||
|
|
||||||
public:
|
|
||||||
void registerTypes(const char* uri);
|
|
||||||
};
|
|
26
ScreenPlaySysInfo/src/TestMain.cpp
Normal file
26
ScreenPlaySysInfo/src/TestMain.cpp
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#include <QGuiApplication>
|
||||||
|
#include <QQmlApplicationEngine>
|
||||||
|
#include <QVersionNumber>
|
||||||
|
#include <QtQml/qqmlextensionplugin.h>
|
||||||
|
|
||||||
|
Q_IMPORT_QML_PLUGIN(ScreenPlaySysInfoPlugin)
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
QGuiApplication app(argc, argv);
|
||||||
|
|
||||||
|
QQmlApplicationEngine engine;
|
||||||
|
// The first subfolder is the libraryName followed by the regular
|
||||||
|
// folder strucutre: LibararyName/Subfolder
|
||||||
|
const QUrl url(u"qrc:/ScreenPlaySysInfo/src/TestMain.qml"_qs);
|
||||||
|
QObject::connect(
|
||||||
|
&engine, &QQmlApplicationEngine::objectCreated,
|
||||||
|
&app, [url](QObject* obj, const QUrl& objUrl) {
|
||||||
|
if (!obj && url == objUrl)
|
||||||
|
QCoreApplication::exit(-1);
|
||||||
|
},
|
||||||
|
Qt::QueuedConnection);
|
||||||
|
engine.load(url);
|
||||||
|
|
||||||
|
return app.exec();
|
||||||
|
}
|
183
ScreenPlaySysInfo/src/TestMain.qml
Normal file
183
ScreenPlaySysInfo/src/TestMain.qml
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
import QtQuick
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import QtQuick.Controls
|
||||||
|
import QtQuick.Controls.Material
|
||||||
|
import ScreenPlaySysInfo 1.0
|
||||||
|
|
||||||
|
Window {
|
||||||
|
id: root
|
||||||
|
width: 1366
|
||||||
|
height: 768
|
||||||
|
visible: true
|
||||||
|
title: qsTr("ScreenPlaySysInfo")
|
||||||
|
color: "#19181E"
|
||||||
|
|
||||||
|
property color accentColor: "#FF9800"
|
||||||
|
property string fontFamily: "Arial"
|
||||||
|
property int fontPointSize: 16
|
||||||
|
|
||||||
|
SysInfo {
|
||||||
|
id:sysInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.fill: wrapper
|
||||||
|
anchors.margins: -50
|
||||||
|
color: "#212128"
|
||||||
|
border.color: root.accentColor
|
||||||
|
border.width: 10
|
||||||
|
}
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
id: wrapper
|
||||||
|
anchors {
|
||||||
|
horizontalCenter: parent.horizontalCenter
|
||||||
|
verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: txtGPU
|
||||||
|
text: "GPU"
|
||||||
|
color: root.accentColor
|
||||||
|
font.family: root.fontFamily
|
||||||
|
font.pointSize: 60
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
Text {
|
||||||
|
id: name
|
||||||
|
text: sysInfo.gpu.vendor
|
||||||
|
color: root.accentColor
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
font {
|
||||||
|
pointSize: 16
|
||||||
|
family: "Fira Code"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
text: sysInfo.gpu.name
|
||||||
|
color: root.accentColor
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
font {
|
||||||
|
pointSize: 16
|
||||||
|
family: root.fontFamily
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: txtUptime
|
||||||
|
text: "UPTIME"
|
||||||
|
color: root.accentColor
|
||||||
|
font.family: root.fontFamily
|
||||||
|
font.pointSize: 60
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
id: valuesLayout
|
||||||
|
spacing: 20
|
||||||
|
Text {
|
||||||
|
id: txtYears
|
||||||
|
text: "YEARS " + sysInfo.uptime.years
|
||||||
|
color: root.accentColor
|
||||||
|
font.family: root.fontFamily
|
||||||
|
font.pointSize: root.fontPointSize
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
text: "DAYS " + sysInfo.uptime.days
|
||||||
|
color: root.accentColor
|
||||||
|
font.family: root.fontFamily
|
||||||
|
font.pointSize: root.fontPointSize
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
text: "HOURS " + sysInfo.uptime.hours
|
||||||
|
color: root.accentColor
|
||||||
|
font.family: root.fontFamily
|
||||||
|
font.pointSize: root.fontPointSize
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
text: "MINUTES " + sysInfo.uptime.minutes
|
||||||
|
color: root.accentColor
|
||||||
|
font.family: root.fontFamily
|
||||||
|
font.pointSize: root.fontPointSize
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: txtSeconds
|
||||||
|
text: "SECONDS " + sysInfo.uptime.seconds
|
||||||
|
color: root.accentColor
|
||||||
|
font.family: root.fontFamily
|
||||||
|
font.pointSize: root.fontPointSize
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
id: txtCPU
|
||||||
|
text: "CPU"
|
||||||
|
color: root.accentColor
|
||||||
|
font.family: root.fontFamily
|
||||||
|
font.pointSize: 60
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
}
|
||||||
|
Row {
|
||||||
|
id: row
|
||||||
|
spacing: 10
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Text {
|
||||||
|
id: txtCPUValue
|
||||||
|
text: Math.floor(sysInfo.cpu.usage)
|
||||||
|
color: root.accentColor
|
||||||
|
font.family: root.fontFamily
|
||||||
|
width: 70
|
||||||
|
}
|
||||||
|
ProgressBar {
|
||||||
|
from: 0
|
||||||
|
to: 100
|
||||||
|
value: Math.floor(sysInfo.cpu.usage)
|
||||||
|
Layout.fillWidth: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: txtStorage
|
||||||
|
text: "STORAGE"
|
||||||
|
color: root.accentColor
|
||||||
|
font.family: root.fontFamily
|
||||||
|
font.pointSize: 60
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.preferredHeight: 20
|
||||||
|
}
|
||||||
|
|
||||||
|
ListView {
|
||||||
|
id: storageListView
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.preferredHeight: 100
|
||||||
|
model: sysInfo.storage
|
||||||
|
delegate: Item {
|
||||||
|
width: storageListView.width
|
||||||
|
height: 40
|
||||||
|
Row {
|
||||||
|
spacing: 10
|
||||||
|
Text {
|
||||||
|
id: txtStorageName
|
||||||
|
text: name
|
||||||
|
color: root.accentColor
|
||||||
|
font.family: root.fontFamily
|
||||||
|
width: 70
|
||||||
|
}
|
||||||
|
ProgressBar {
|
||||||
|
from: 0
|
||||||
|
to: bytesTotal
|
||||||
|
value: bytesAvailable
|
||||||
|
width: storageListView.width - txtStorageName.width - row.spacing
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -38,6 +38,7 @@
|
|||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
#include <QQmlEngine>
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
#include <qt_windows.h>
|
#include <qt_windows.h>
|
||||||
@ -46,9 +47,9 @@
|
|||||||
|
|
||||||
class CPU : public QObject {
|
class CPU : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
Q_PROPERTY(float usage READ usage NOTIFY usageChanged)
|
Q_PROPERTY(float usage READ usage NOTIFY usageChanged)
|
||||||
Q_PROPERTY(int tickRate READ tickRate WRITE setTickRate NOTIFY tickRateChanged)
|
Q_PROPERTY(int tickRate READ tickRate WRITE setTickRate NOTIFY tickRateChanged)
|
||||||
|
QML_ELEMENT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit CPU(QObject* parent = nullptr);
|
explicit CPU(QObject* parent = nullptr);
|
@ -1,5 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
#include <QQmlEngine>
|
||||||
|
|
||||||
class GPU : public QObject {
|
class GPU : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@ -8,6 +9,7 @@ class GPU : public QObject {
|
|||||||
Q_PROPERTY(int ramSize READ ramSize WRITE setRamSize NOTIFY ramSizeChanged)
|
Q_PROPERTY(int ramSize READ ramSize WRITE setRamSize NOTIFY ramSizeChanged)
|
||||||
Q_PROPERTY(int cacheSize READ cacheSize WRITE setCacheSize NOTIFY cacheSizeChanged)
|
Q_PROPERTY(int cacheSize READ cacheSize WRITE setCacheSize NOTIFY cacheSizeChanged)
|
||||||
Q_PROPERTY(int maxFrequency READ maxFrequency WRITE setMaxFrequency NOTIFY maxFrequencyChanged)
|
Q_PROPERTY(int maxFrequency READ maxFrequency WRITE setMaxFrequency NOTIFY maxFrequencyChanged)
|
||||||
|
QML_ELEMENT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit GPU(QObject* parent = nullptr);
|
explicit GPU(QObject* parent = nullptr);
|
@ -37,6 +37,7 @@
|
|||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
#include <QQmlEngine>
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
#include <qt_windows.h>
|
#include <qt_windows.h>
|
||||||
@ -48,15 +49,13 @@ class RAM : public QObject {
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
Q_PROPERTY(float usage READ usage NOTIFY usageChanged)
|
Q_PROPERTY(float usage READ usage NOTIFY usageChanged)
|
||||||
|
|
||||||
Q_PROPERTY(unsigned long long usedPhysicalMemory READ usedPhysicalMemory NOTIFY usedPhysicalMemoryChanged)
|
Q_PROPERTY(unsigned long long usedPhysicalMemory READ usedPhysicalMemory NOTIFY usedPhysicalMemoryChanged)
|
||||||
Q_PROPERTY(unsigned long long totalPhysicalMemory READ totalPhysicalMemory NOTIFY totalPhysicalMemoryChanged)
|
Q_PROPERTY(unsigned long long totalPhysicalMemory READ totalPhysicalMemory NOTIFY totalPhysicalMemoryChanged)
|
||||||
|
|
||||||
Q_PROPERTY(unsigned long long usedVirtualMemory READ usedVirtualMemory NOTIFY usedVirtualMemoryChanged)
|
Q_PROPERTY(unsigned long long usedVirtualMemory READ usedVirtualMemory NOTIFY usedVirtualMemoryChanged)
|
||||||
Q_PROPERTY(unsigned long long totalVirtualMemory READ totalVirtualMemory NOTIFY totalVirtualMemoryChanged)
|
Q_PROPERTY(unsigned long long totalVirtualMemory READ totalVirtualMemory NOTIFY totalVirtualMemoryChanged)
|
||||||
|
|
||||||
Q_PROPERTY(unsigned long long usedPagingMemory READ usedPagingMemory NOTIFY usedPagingMemoryChanged)
|
Q_PROPERTY(unsigned long long usedPagingMemory READ usedPagingMemory NOTIFY usedPagingMemoryChanged)
|
||||||
Q_PROPERTY(unsigned long long totalPagingMemory READ totalPagingMemory NOTIFY totalPagingMemoryChanged)
|
Q_PROPERTY(unsigned long long totalPagingMemory READ totalPagingMemory NOTIFY totalPagingMemoryChanged)
|
||||||
|
QML_ELEMENT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit RAM(QObject* parent = nullptr);
|
explicit RAM(QObject* parent = nullptr);
|
@ -39,9 +39,11 @@
|
|||||||
#include <QStorageInfo>
|
#include <QStorageInfo>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <QVector>
|
#include <QVector>
|
||||||
|
#include <QQmlEngine>
|
||||||
|
|
||||||
class Storage : public QAbstractListModel {
|
class Storage : public QAbstractListModel {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
QML_ELEMENT
|
||||||
public:
|
public:
|
||||||
explicit Storage(QObject* parent = nullptr);
|
explicit Storage(QObject* parent = nullptr);
|
||||||
|
|
@ -34,6 +34,7 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <QQmlEngine>
|
||||||
#include <QQuickItem>
|
#include <QQuickItem>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
@ -45,12 +46,12 @@
|
|||||||
|
|
||||||
class SysInfo : public QQuickItem {
|
class SysInfo : public QQuickItem {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
Q_PROPERTY(GPU* gpu READ gpu NOTIFY gpuChanged)
|
Q_PROPERTY(GPU* gpu READ gpu NOTIFY gpuChanged)
|
||||||
Q_PROPERTY(RAM* ram READ ram NOTIFY ramChanged)
|
Q_PROPERTY(RAM* ram READ ram NOTIFY ramChanged)
|
||||||
Q_PROPERTY(CPU* cpu READ cpu NOTIFY cpuChanged)
|
Q_PROPERTY(CPU* cpu READ cpu NOTIFY cpuChanged)
|
||||||
Q_PROPERTY(Storage* storage READ storage NOTIFY storageChanged)
|
Q_PROPERTY(Storage* storage READ storage NOTIFY storageChanged)
|
||||||
Q_PROPERTY(Uptime* uptime READ uptime NOTIFY uptimeChanged)
|
Q_PROPERTY(Uptime* uptime READ uptime NOTIFY uptimeChanged)
|
||||||
|
QML_ELEMENT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SysInfo(QQuickItem* parent = nullptr);
|
SysInfo(QQuickItem* parent = nullptr);
|
@ -1,15 +1,16 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
#include <QQmlEngine>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
class Uptime : public QObject {
|
class Uptime : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
Q_PROPERTY(int days READ days WRITE setDays NOTIFY daysChanged)
|
Q_PROPERTY(int days READ days WRITE setDays NOTIFY daysChanged)
|
||||||
Q_PROPERTY(int years READ years WRITE setYears NOTIFY yearsChanged)
|
Q_PROPERTY(int years READ years WRITE setYears NOTIFY yearsChanged)
|
||||||
Q_PROPERTY(int hours READ hours WRITE setHours NOTIFY hoursChanged)
|
Q_PROPERTY(int hours READ hours WRITE setHours NOTIFY hoursChanged)
|
||||||
Q_PROPERTY(int minutes READ minutes WRITE setMinutes NOTIFY minutesChanged)
|
Q_PROPERTY(int minutes READ minutes WRITE setMinutes NOTIFY minutesChanged)
|
||||||
Q_PROPERTY(int seconds READ seconds WRITE setSeconds NOTIFY secondsChanged)
|
Q_PROPERTY(int seconds READ seconds WRITE setSeconds NOTIFY secondsChanged)
|
||||||
|
QML_ELEMENT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Uptime(QObject* parent = nullptr);
|
Uptime(QObject* parent = nullptr);
|
@ -6,7 +6,7 @@ set(CMAKE_AUTOMOC ON)
|
|||||||
|
|
||||||
find_package(
|
find_package(
|
||||||
Qt6
|
Qt6
|
||||||
COMPONENTS Core
|
COMPONENTS Core Quick
|
||||||
REQUIRED)
|
REQUIRED)
|
||||||
|
|
||||||
set(SOURCES # cmake-format: sortable
|
set(SOURCES # cmake-format: sortable
|
||||||
@ -14,8 +14,18 @@ set(SOURCES # cmake-format: sortable
|
|||||||
|
|
||||||
set(HEADER
|
set(HEADER
|
||||||
# cmake-format: sortable
|
# cmake-format: sortable
|
||||||
inc/public/ScreenPlayUtil/util.h inc/public/ScreenPlayUtil/httpfileserver.h inc/public/ScreenPlayUtil/contenttypes.h
|
inc/public/ScreenPlayUtil/util.h
|
||||||
inc/public/ScreenPlayUtil/projectfile.h)
|
inc/public/ScreenPlayUtil/httpfileserver.h
|
||||||
|
inc/public/ScreenPlayUtil/contenttypes.h
|
||||||
|
inc/public/ScreenPlayUtil/projectfile.h
|
||||||
|
inc/public/ScreenPlayUtil/AutoPropertyHelpers.h
|
||||||
|
inc/public/ScreenPlayUtil/ConstRefPropertyHelpers.h
|
||||||
|
inc/public/ScreenPlayUtil/EnumClassHelper.h
|
||||||
|
inc/public/ScreenPlayUtil/HelpersCommon.h
|
||||||
|
inc/public/ScreenPlayUtil/ListPropertyHelper.h
|
||||||
|
inc/public/ScreenPlayUtil/PropertyHelpers.h
|
||||||
|
inc/public/ScreenPlayUtil/PtrPropertyHelpers.h
|
||||||
|
inc/public/ScreenPlayUtil/SingletonHelper.h)
|
||||||
|
|
||||||
add_library(${PROJECT_NAME} STATIC ${SOURCES} ${HEADER})
|
add_library(${PROJECT_NAME} STATIC ${SOURCES} ${HEADER})
|
||||||
|
|
||||||
@ -27,7 +37,7 @@ target_include_directories(
|
|||||||
PUBLIC inc/public/
|
PUBLIC inc/public/
|
||||||
PRIVATE src/)
|
PRIVATE src/)
|
||||||
|
|
||||||
target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Core)
|
target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Core Qt6::Quick)
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
# Used for query windows monitor data
|
# Used for query windows monitor data
|
||||||
|
@ -0,0 +1,76 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
#include "HelpersCommon.h"
|
||||||
|
|
||||||
|
#define AUTO_GETTER(type, name) \
|
||||||
|
public: \
|
||||||
|
CheapestType<type>::type_def MAKE_GETTER_NAME(name)() const { return m_##name; }
|
||||||
|
|
||||||
|
#define AUTO_SETTER(type, name) \
|
||||||
|
public: \
|
||||||
|
void set_##name(CheapestType<type>::type_def name) \
|
||||||
|
{ \
|
||||||
|
if (m_##name != name) { \
|
||||||
|
m_##name = name; \
|
||||||
|
Q_EMIT name##Changed(); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define W_AUTO_PROPERTY(type, name) \
|
||||||
|
protected: \
|
||||||
|
Q_PROPERTY(type name READ MAKE_GETTER_NAME(name) WRITE set_##name NOTIFY name##Changed) \
|
||||||
|
\
|
||||||
|
MEMBER(type, name) \
|
||||||
|
AUTO_GETTER(type, name) \
|
||||||
|
AUTO_SETTER(type, name) \
|
||||||
|
NOTIFIER(name) \
|
||||||
|
private:
|
||||||
|
|
||||||
|
#define R_AUTO_PROPERTY(type, name) \
|
||||||
|
protected: \
|
||||||
|
Q_PROPERTY(type name READ MAKE_GETTER_NAME(name) NOTIFY name##Changed) \
|
||||||
|
\
|
||||||
|
MEMBER(type, name) \
|
||||||
|
AUTO_GETTER(type, name) \
|
||||||
|
AUTO_SETTER(type, name) \
|
||||||
|
NOTIFIER(name) \
|
||||||
|
private:
|
||||||
|
|
||||||
|
#define C_AUTO_PROPERTY(type, name) \
|
||||||
|
protected: \
|
||||||
|
Q_PROPERTY(type name READ MAKE_GETTER_NAME(name) CONSTANT) \
|
||||||
|
\
|
||||||
|
MEMBER(type, name) \
|
||||||
|
AUTO_GETTER(type, name) \
|
||||||
|
private:
|
||||||
|
|
||||||
|
#define W_AUTO_PROPERTY_DEFAULT(type, name, defaultValue) \
|
||||||
|
Q_PROPERTY(type name READ MAKE_GETTER_NAME(name) WRITE set_##name NOTIFY name##Changed) \
|
||||||
|
\
|
||||||
|
MEMBER_DEFAULT(type, name, defaultValue) \
|
||||||
|
AUTO_GETTER(type, name) \
|
||||||
|
AUTO_SETTER(type, name) \
|
||||||
|
NOTIFIER(name) \
|
||||||
|
private:
|
||||||
|
|
||||||
|
// NOTE : test class for all cases
|
||||||
|
|
||||||
|
class _Test_QmlAutoProperty_ : public QObject {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
W_AUTO_PROPERTY(bool, var1)
|
||||||
|
W_AUTO_PROPERTY(QString, var2)
|
||||||
|
W_AUTO_PROPERTY(QObject*, var3)
|
||||||
|
|
||||||
|
R_AUTO_PROPERTY(bool, var4)
|
||||||
|
R_AUTO_PROPERTY(QString, var5)
|
||||||
|
R_AUTO_PROPERTY(QObject*, var6)
|
||||||
|
|
||||||
|
C_AUTO_PROPERTY(bool, var7)
|
||||||
|
C_AUTO_PROPERTY(QString, var8)
|
||||||
|
C_AUTO_PROPERTY(QObject*, var9)
|
||||||
|
|
||||||
|
W_AUTO_PROPERTY_DEFAULT(bool, var10, true)
|
||||||
|
};
|
@ -0,0 +1,63 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
#include "HelpersCommon.h"
|
||||||
|
|
||||||
|
#define CONST_SETTER(type, name) \
|
||||||
|
public: \
|
||||||
|
void set_##name(const type& name) \
|
||||||
|
{ \
|
||||||
|
if (m_##name != name) { \
|
||||||
|
m_##name = name; \
|
||||||
|
Q_EMIT name##Changed(); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define CONST_GETTER(type, name) \
|
||||||
|
public: \
|
||||||
|
const type& MAKE_GETTER_NAME(name)() const { return m_##name; }
|
||||||
|
|
||||||
|
#define W_CREF_PROPERTY(type, name) \
|
||||||
|
protected: \
|
||||||
|
Q_PROPERTY(type name READ MAKE_GETTER_NAME(name) WRITE set_##name NOTIFY name##Changed) \
|
||||||
|
private: \
|
||||||
|
MEMBER(type, name) \
|
||||||
|
CONST_GETTER(type, name) \
|
||||||
|
CONST_SETTER(type, name) \
|
||||||
|
NOTIFIER(name)
|
||||||
|
|
||||||
|
#define R_CREF_PROPERTY(type, name) \
|
||||||
|
protected: \
|
||||||
|
Q_PROPERTY(type name READ MAKE_GETTER_NAME(name) NOTIFY name##Changed) \
|
||||||
|
MEMBER(type, name) \
|
||||||
|
CONST_GETTER(type, name) \
|
||||||
|
CONST_SETTER(type, name) \
|
||||||
|
NOTIFIER(name) \
|
||||||
|
private:
|
||||||
|
|
||||||
|
#define C_CREF_PROPERTY(type, name) \
|
||||||
|
protected: \
|
||||||
|
Q_PROPERTY(type name READ MAKE_GETTER_NAME(name) CONSTANT) \
|
||||||
|
MEMBER(type, name) \
|
||||||
|
CONST_GETTER(type, name) \
|
||||||
|
private:
|
||||||
|
|
||||||
|
#define W_CREF_PROPERTY_DEFAULT(type, name, defaultValue) \
|
||||||
|
protected: \
|
||||||
|
Q_PROPERTY(type name READ MAKE_GETTER_NAME(name) WRITE set_##name NOTIFY name##Changed) \
|
||||||
|
private: \
|
||||||
|
MEMBER_DEFAULT(type, name, defaultValue) \
|
||||||
|
CONST_GETTER(type, name) \
|
||||||
|
CONST_SETTER(type, name) \
|
||||||
|
NOTIFIER(name)
|
||||||
|
|
||||||
|
class Test : public QObject {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
W_CREF_PROPERTY(QString, var1)
|
||||||
|
R_CREF_PROPERTY(QString, var2)
|
||||||
|
C_CREF_PROPERTY(QString, var3)
|
||||||
|
|
||||||
|
W_CREF_PROPERTY_DEFAULT(QString, var4, QStringLiteral("test"))
|
||||||
|
};
|
40
ScreenPlayUtil/inc/public/ScreenPlayUtil/EnumClassHelper.h
Normal file
40
ScreenPlayUtil/inc/public/ScreenPlayUtil/EnumClassHelper.h
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QMetaEnum>
|
||||||
|
#include <QMetaObject>
|
||||||
|
#include <QObject>
|
||||||
|
#include <QQmlEngine>
|
||||||
|
#include <QString>
|
||||||
|
#include <QtQml/QtQml>
|
||||||
|
|
||||||
|
#ifdef Q_ENUM
|
||||||
|
#define QML_EXPORT_ENUM Q_ENUM
|
||||||
|
#else
|
||||||
|
#define QML_EXPORT_ENUM Q_ENUMS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define QML_ENUM_CLASS(NAME, ...) \
|
||||||
|
struct NAME { \
|
||||||
|
Q_GADGET \
|
||||||
|
public: \
|
||||||
|
enum Type { __VA_ARGS__ }; \
|
||||||
|
QML_EXPORT_ENUM(Type) \
|
||||||
|
static QString asString(const int value) \
|
||||||
|
{ \
|
||||||
|
return QString::fromLatin1(staticMetaObject.enumerator(0).valueToKey(value)); \
|
||||||
|
} \
|
||||||
|
static void registerQmlModule(const char* uri, const int majorVersion, const int minorVersion, const char* name) \
|
||||||
|
{ \
|
||||||
|
qmlRegisterUncreatableType<NAME>(uri, majorVersion, minorVersion, name, \
|
||||||
|
QStringLiteral("Enum class, can't be instanciated !")); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
private: \
|
||||||
|
explicit NAME() { } \
|
||||||
|
NAME(const NAME&); \
|
||||||
|
NAME& operator=(const NAME&); \
|
||||||
|
~NAME(); \
|
||||||
|
}; \
|
||||||
|
Q_DECLARE_METATYPE(NAME::Type)
|
||||||
|
|
||||||
|
QML_ENUM_CLASS(_Test_QmlEnumClass_) // NOTE : to avoid "no suitable class found" MOC note
|
73
ScreenPlayUtil/inc/public/ScreenPlayUtil/HelpersCommon.h
Normal file
73
ScreenPlayUtil/inc/public/ScreenPlayUtil/HelpersCommon.h
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QtGlobal>
|
||||||
|
|
||||||
|
// NOTE : SFINAE trickery to find which type is the cheapest between T and const T &
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
struct CheapestType {
|
||||||
|
using type_def = const T&;
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct CheapestType<bool> {
|
||||||
|
using type_def = bool;
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct CheapestType<quint8> {
|
||||||
|
using type_def = quint8;
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct CheapestType<quint16> {
|
||||||
|
using type_def = quint16;
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct CheapestType<quint32> {
|
||||||
|
using type_def = quint32;
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct CheapestType<quint64> {
|
||||||
|
using type_def = quint64;
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct CheapestType<qint8> {
|
||||||
|
using type_def = qint8;
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct CheapestType<qint16> {
|
||||||
|
using type_def = qint16;
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct CheapestType<qint32> {
|
||||||
|
using type_def = qint32;
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct CheapestType<qint64> {
|
||||||
|
using type_def = qint64;
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct CheapestType<float> {
|
||||||
|
using type_def = float;
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct CheapestType<double> {
|
||||||
|
using type_def = double;
|
||||||
|
};
|
||||||
|
template <typename T>
|
||||||
|
struct CheapestType<T*> {
|
||||||
|
using type_def = T*;
|
||||||
|
};
|
||||||
|
|
||||||
|
// NOTE : define to add/remove 'get_' prefix on getters
|
||||||
|
#define MAKE_GETTER_NAME(name) name
|
||||||
|
|
||||||
|
#define MEMBER(type, name) \
|
||||||
|
private: \
|
||||||
|
type m_##name {};
|
||||||
|
|
||||||
|
#define MEMBER_DEFAULT(type, name, value) \
|
||||||
|
private: \
|
||||||
|
type m_##name { value };
|
||||||
|
|
||||||
|
#define NOTIFIER(name) \
|
||||||
|
Q_SIGNALS: \
|
||||||
|
void name##Changed();
|
@ -0,0 +1,65 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QQmlListProperty>
|
||||||
|
#include <QVector>
|
||||||
|
|
||||||
|
#include "HelpersCommon.h"
|
||||||
|
|
||||||
|
template <class ObjType>
|
||||||
|
class QQmlSmartListWrapper : public QQmlListProperty<ObjType> {
|
||||||
|
public:
|
||||||
|
typedef QVector<ObjType*> CppListType;
|
||||||
|
typedef QQmlListProperty<ObjType> QmlListPropertyType;
|
||||||
|
typedef QQmlSmartListWrapper<ObjType> SmartListWrapperType;
|
||||||
|
|
||||||
|
typedef typename CppListType::const_iterator const_iterator;
|
||||||
|
|
||||||
|
explicit QQmlSmartListWrapper(QObject* object, const int reserve = 0)
|
||||||
|
: QmlListPropertyType(object,
|
||||||
|
&m_items,
|
||||||
|
&SmartListWrapperType::callbackAppend,
|
||||||
|
&SmartListWrapperType::callbackCount,
|
||||||
|
&SmartListWrapperType::callbackAt,
|
||||||
|
&SmartListWrapperType::callbackClear)
|
||||||
|
{
|
||||||
|
if (reserve > 0) {
|
||||||
|
m_items.reserve(reserve);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const CppListType& items() const { return m_items; }
|
||||||
|
|
||||||
|
const_iterator begin() const { return m_items.begin(); }
|
||||||
|
|
||||||
|
const_iterator end() const { return m_items.end(); }
|
||||||
|
|
||||||
|
const_iterator constBegin() const { return m_items.constBegin(); }
|
||||||
|
|
||||||
|
const_iterator constEnd() const { return m_items.constEnd(); }
|
||||||
|
|
||||||
|
static qsizetype callbackCount(QmlListPropertyType* prop) { return static_cast<CppListType*>(prop->data)->count(); }
|
||||||
|
|
||||||
|
static void callbackClear(QmlListPropertyType* prop) { static_cast<CppListType*>(prop->data)->clear(); }
|
||||||
|
|
||||||
|
static void callbackAppend(QmlListPropertyType* prop, ObjType* obj)
|
||||||
|
{
|
||||||
|
static_cast<CppListType*>(prop->data)->append(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ObjType* callbackAt(QmlListPropertyType* prop, qsizetype idx)
|
||||||
|
{
|
||||||
|
return static_cast<CppListType*>(prop->data)->at(idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
CppListType m_items;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define LIST_PROPERTY(TYPE, NAME) \
|
||||||
|
private: \
|
||||||
|
Q_PROPERTY(QQmlListProperty<TYPE> NAME READ MAKE_GETTER_NAME(NAME) CONSTANT) \
|
||||||
|
public: \
|
||||||
|
const QQmlSmartListWrapper<TYPE>& MAKE_GETTER_NAME(NAME)() const { return m_##NAME; } \
|
||||||
|
\
|
||||||
|
private: \
|
||||||
|
QQmlSmartListWrapper<TYPE> m_##NAME;
|
66
ScreenPlayUtil/inc/public/ScreenPlayUtil/PropertyHelpers.h
Normal file
66
ScreenPlayUtil/inc/public/ScreenPlayUtil/PropertyHelpers.h
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
#include "HelpersCommon.h"
|
||||||
|
|
||||||
|
#define PROP_GETTER(type, name) \
|
||||||
|
public: \
|
||||||
|
type MAKE_GETTER_NAME(name)() const { return m_##name; }
|
||||||
|
|
||||||
|
#define PROP_SETTER(type, name) \
|
||||||
|
public: \
|
||||||
|
void set_##name(type name) \
|
||||||
|
{ \
|
||||||
|
if (m_##name != name) { \
|
||||||
|
m_##name = name; \
|
||||||
|
Q_EMIT name##Changed(); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define W_PROPERTY(type, name) \
|
||||||
|
protected: \
|
||||||
|
Q_PROPERTY(type name READ MAKE_GETTER_NAME(name) WRITE set_##name NOTIFY name##Changed) \
|
||||||
|
\
|
||||||
|
MEMBER(type, name) \
|
||||||
|
PROP_GETTER(type, name) \
|
||||||
|
PROP_SETTER(type, name) \
|
||||||
|
NOTIFIER(name) \
|
||||||
|
private:
|
||||||
|
|
||||||
|
#define R_PROPERTY(type, name) \
|
||||||
|
protected: \
|
||||||
|
Q_PROPERTY(type name READ MAKE_GETTER_NAME(name) NOTIFY name##Changed) \
|
||||||
|
\
|
||||||
|
MEMBER(type, name) \
|
||||||
|
PROP_GETTER(type, name) \
|
||||||
|
PROP_SETTER(type, name) \
|
||||||
|
NOTIFIER(name) \
|
||||||
|
private:
|
||||||
|
|
||||||
|
#define C_PROPERTY(type, name) \
|
||||||
|
protected: \
|
||||||
|
Q_PROPERTY(type name READ MAKE_GETTER_NAME(name) CONSTANT) \
|
||||||
|
\
|
||||||
|
MEMBER(type, name) \
|
||||||
|
PROP_GETTER(type, name) \
|
||||||
|
private:
|
||||||
|
|
||||||
|
#define W_PROPERTY_DEFAULT(type, name, defaultValue) \
|
||||||
|
protected: \
|
||||||
|
Q_PROPERTY(type name READ MAKE_GETTER_NAME(name) WRITE set_##name NOTIFY name##Changed) \
|
||||||
|
\
|
||||||
|
MEMBER_DEFAULT(type, name, defaultValue) \
|
||||||
|
PROP_GETTER(type, name) \
|
||||||
|
PROP_SETTER(type, name) \
|
||||||
|
NOTIFIER(name) \
|
||||||
|
private:
|
||||||
|
|
||||||
|
class _QmlVarProperty_ : public QObject {
|
||||||
|
Q_OBJECT
|
||||||
|
W_PROPERTY(int, var1)
|
||||||
|
R_PROPERTY(bool, var2)
|
||||||
|
C_PROPERTY(int, var3)
|
||||||
|
|
||||||
|
W_PROPERTY_DEFAULT(int, var4, 5)
|
||||||
|
};
|
126
ScreenPlayUtil/inc/public/ScreenPlayUtil/PtrPropertyHelpers.h
Normal file
126
ScreenPlayUtil/inc/public/ScreenPlayUtil/PtrPropertyHelpers.h
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#include "HelpersCommon.h"
|
||||||
|
|
||||||
|
#define PTR_GETTER(type, name) \
|
||||||
|
public: \
|
||||||
|
type* MAKE_GETTER_NAME(name)() const { return m_##name; }
|
||||||
|
|
||||||
|
#define PTR_SETTER(type, name) \
|
||||||
|
public: \
|
||||||
|
void set_##name(type* name) \
|
||||||
|
{ \
|
||||||
|
if (m_##name != name) { \
|
||||||
|
m_##name = name; \
|
||||||
|
Q_EMIT name##Changed(); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define SMART_PTR_GETTER(type, name) \
|
||||||
|
public: \
|
||||||
|
type* MAKE_GETTER_NAME(name)() const { return m_##name.get(); }
|
||||||
|
|
||||||
|
#define SMART_PTR_SETTER(type, name) \
|
||||||
|
public: \
|
||||||
|
void set_##name(type name) \
|
||||||
|
{ \
|
||||||
|
m_##name = std::move(name); \
|
||||||
|
Q_EMIT name##Changed(); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define W_PTR_PROPERTY(type, name) \
|
||||||
|
protected: \
|
||||||
|
Q_PROPERTY(type* name READ MAKE_GETTER_NAME(name) WRITE set_##name NOTIFY name##Changed) \
|
||||||
|
\
|
||||||
|
MEMBER(type*, name) \
|
||||||
|
PTR_GETTER(type, name) \
|
||||||
|
PTR_SETTER(type, name) \
|
||||||
|
NOTIFIER(name) \
|
||||||
|
private:
|
||||||
|
|
||||||
|
#define R_PTR_PROPERTY(type, name) \
|
||||||
|
protected: \
|
||||||
|
Q_PROPERTY(type* name READ MAKE_GETTER_NAME(name) NOTIFY name##Changed) \
|
||||||
|
\
|
||||||
|
MEMBER(type*, name) \
|
||||||
|
PTR_GETTER(type, name) \
|
||||||
|
PTR_SETTER(type, name) \
|
||||||
|
NOTIFIER(name) \
|
||||||
|
private:
|
||||||
|
|
||||||
|
#define C_PTR_PROPERTY(type, name) \
|
||||||
|
protected: \
|
||||||
|
Q_PROPERTY(type* name READ MAKE_GETTER_NAME(name) CONSTANT) \
|
||||||
|
\
|
||||||
|
MEMBER(type*, name) \
|
||||||
|
PTR_GETTER(type, name) \
|
||||||
|
private:
|
||||||
|
|
||||||
|
#define W_PTR_PROPERTY_DEFAULT(type, name, defaultValue) \
|
||||||
|
protected: \
|
||||||
|
Q_PROPERTY(type* name READ MAKE_GETTER_NAME(name) WRITE set_##name NOTIFY name##Changed) \
|
||||||
|
\
|
||||||
|
MEMBER_DEFAULT(type*, name, defaultValue) \
|
||||||
|
PTR_GETTER(type, name) \
|
||||||
|
PTR_SETTER(type, name) \
|
||||||
|
NOTIFIER(name) \
|
||||||
|
private:
|
||||||
|
|
||||||
|
#define UNIQUE_PTR_PROPERTY(type, name) \
|
||||||
|
protected: \
|
||||||
|
Q_PROPERTY(type* name READ name NOTIFY name##Changed) \
|
||||||
|
\
|
||||||
|
MEMBER(std::unique_ptr<type>, name) \
|
||||||
|
SMART_PTR_GETTER(type, name) \
|
||||||
|
SMART_PTR_SETTER(std::unique_ptr<type>&, name) \
|
||||||
|
NOTIFIER(name) \
|
||||||
|
private:
|
||||||
|
|
||||||
|
#define UNIQUE_PTR_PROPERTY_INIT(type, name) \
|
||||||
|
protected: \
|
||||||
|
Q_PROPERTY(type* name READ name NOTIFY name##Changed) \
|
||||||
|
\
|
||||||
|
MEMBER_DEFAULT(std::unique_ptr<type>, name, std::make_unique<type>()) \
|
||||||
|
SMART_PTR_GETTER(type, name) \
|
||||||
|
SMART_PTR_SETTER(std::unique_ptr<type>&, name) \
|
||||||
|
NOTIFIER(name) \
|
||||||
|
private:
|
||||||
|
|
||||||
|
#define SHARED_PTR_PROPERTY(type, name) \
|
||||||
|
protected: \
|
||||||
|
Q_PROPERTY(type* name READ name NOTIFY name##Changed) \
|
||||||
|
\
|
||||||
|
MEMBER(std::shared_ptr<type>, name) \
|
||||||
|
SMART_PTR_GETTER(type, name) \
|
||||||
|
SMART_PTR_SETTER(std::unique_ptr<type>&, name) \
|
||||||
|
NOTIFIER(name) \
|
||||||
|
private:
|
||||||
|
|
||||||
|
#define SHARED_PTR_PROPERTY_INIT(type, name) \
|
||||||
|
protected: \
|
||||||
|
Q_PROPERTY(type* name READ name NOTIFY name##Changed) \
|
||||||
|
\
|
||||||
|
MEMBER_DEFAULT(std::shared_ptr<type>, name, std::make_shared<type>()) \
|
||||||
|
SMART_PTR_GETTER(type, name) \
|
||||||
|
SMART_PTR_SETTER(std::shared_ptr<type>, name) \
|
||||||
|
NOTIFIER(name) \
|
||||||
|
private:
|
||||||
|
|
||||||
|
class _QmlPtrProperty_ : public QObject {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
W_PTR_PROPERTY(int, var1)
|
||||||
|
R_PTR_PROPERTY(bool, var2)
|
||||||
|
C_PTR_PROPERTY(QString, test)
|
||||||
|
|
||||||
|
// W_PTR_PROPERTY_DEFAULT(QString, var4, nullptr)
|
||||||
|
|
||||||
|
// UNIQUE_PTR_PROPERTY(QString, test2)
|
||||||
|
// UNIQUE_PTR_PROPERTY_INIT(QString, test3)
|
||||||
|
|
||||||
|
// SHARED_PTR_PROPERTY(QString, test4)
|
||||||
|
// SHARED_PTR_PROPERTY_INIT(QString, test5)
|
||||||
|
};
|
2
ScreenPlayUtil/inc/public/ScreenPlayUtil/Readme.md
Normal file
2
ScreenPlayUtil/inc/public/ScreenPlayUtil/Readme.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# Qt Super-Macros
|
||||||
|
Based on: https://github.com/DoozyX/qt-property-macros
|
31
ScreenPlayUtil/inc/public/ScreenPlayUtil/SingletonHelper.h
Normal file
31
ScreenPlayUtil/inc/public/ScreenPlayUtil/SingletonHelper.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QJSEngine>
|
||||||
|
#include <QObject>
|
||||||
|
#include <QQmlEngine>
|
||||||
|
#include <qqml.h>
|
||||||
|
|
||||||
|
#define QML_SINGLETON_IMPL(CLASS) \
|
||||||
|
public: \
|
||||||
|
static CLASS& instance() \
|
||||||
|
{ \
|
||||||
|
static CLASS ret; \
|
||||||
|
return ret; \
|
||||||
|
} \
|
||||||
|
static QObject* qmlSingletonFactory(QQmlEngine* qmlEngine, QJSEngine* jsEngine) \
|
||||||
|
{ \
|
||||||
|
Q_UNUSED(jsEngine) \
|
||||||
|
Q_UNUSED(qmlEngine) \
|
||||||
|
QObject* ret = &instance(); \
|
||||||
|
QQmlEngine::setObjectOwnership(ret, QQmlEngine::CppOwnership); \
|
||||||
|
return ret; \
|
||||||
|
} \
|
||||||
|
static void registerQmlModule(const char* uri, const int majorVersion, const int minorVersion, const char* name) \
|
||||||
|
{ \
|
||||||
|
qmlRegisterSingletonType<CLASS>(uri, majorVersion, minorVersion, name, &CLASS::qmlSingletonFactory); \
|
||||||
|
}
|
||||||
|
|
||||||
|
class _test_QmlSingleton_ : public QObject {
|
||||||
|
Q_OBJECT
|
||||||
|
QML_SINGLETON_IMPL(_test_QmlSingleton_)
|
||||||
|
};
|
@ -49,7 +49,9 @@
|
|||||||
#include <QJsonObject>
|
#include <QJsonObject>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QVersionNumber>
|
#include <QVersionNumber>
|
||||||
|
#include <QMetaEnum>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
namespace ScreenPlayUtil {
|
namespace ScreenPlayUtil {
|
||||||
#if defined(Q_OS_WIN)
|
#if defined(Q_OS_WIN)
|
||||||
@ -116,4 +118,5 @@ QStringList getAvailableFillModes();
|
|||||||
bool isWallpaper(const ScreenPlay::InstalledType::InstalledType type);
|
bool isWallpaper(const ScreenPlay::InstalledType::InstalledType type);
|
||||||
bool isWidget(const ScreenPlay::InstalledType::InstalledType type);
|
bool isWidget(const ScreenPlay::InstalledType::InstalledType type);
|
||||||
std::optional<QVector<int>> parseStringToIntegerList(const QString string);
|
std::optional<QVector<int>> parseStringToIntegerList(const QString string);
|
||||||
|
float roundDecimalPlaces(const float number);
|
||||||
}
|
}
|
||||||
|
@ -394,4 +394,10 @@ std::optional<QVector<int>> parseStringToIntegerList(const QString string)
|
|||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float roundDecimalPlaces(const float number)
|
||||||
|
{
|
||||||
|
float big = number * 100.0;
|
||||||
|
return std::ceil(big * 0.01);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -51,6 +51,8 @@ qt_add_qml_module(
|
|||||||
${PROJECT_NAME}
|
${PROJECT_NAME}
|
||||||
VERSION
|
VERSION
|
||||||
1.0
|
1.0
|
||||||
|
OUTPUT_DIRECTORY
|
||||||
|
${CMAKE_BINARY_DIR}/bin/${PROJECT_NAME}
|
||||||
QML_FILES
|
QML_FILES
|
||||||
${QML})
|
${QML})
|
||||||
|
|
||||||
@ -58,6 +60,8 @@ target_link_libraries(
|
|||||||
${PROJECT_NAME}
|
${PROJECT_NAME}
|
||||||
PRIVATE ScreenPlaySDK
|
PRIVATE ScreenPlaySDK
|
||||||
ScreenPlayUtil
|
ScreenPlayUtil
|
||||||
|
ScreenPlayWeatherplugin
|
||||||
|
ScreenPlaySysInfoplugin
|
||||||
Qt6::Quick
|
Qt6::Quick
|
||||||
Qt6::Gui
|
Qt6::Gui
|
||||||
Qt6::Widgets
|
Qt6::Widgets
|
||||||
|
@ -15,6 +15,10 @@
|
|||||||
#include "src/macwindow.h"
|
#include "src/macwindow.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
Q_IMPORT_QML_PLUGIN(ScreenPlayWeatherPlugin)
|
||||||
|
Q_IMPORT_QML_PLUGIN(ScreenPlaySysInfoPlugin)
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
QApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
|
QApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
|
||||||
|
49
ScreenPlayWeather/CMakeLists.txt
Normal file
49
ScreenPlayWeather/CMakeLists.txt
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
project(
|
||||||
|
ScreenPlayWeather
|
||||||
|
VERSION 0.1
|
||||||
|
LANGUAGES CXX)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_STANDARD 20)
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
set(CMAKE_AUTOMOC ON)
|
||||||
|
|
||||||
|
find_package(
|
||||||
|
Qt6 6.2
|
||||||
|
COMPONENTS Core Quick
|
||||||
|
REQUIRED)
|
||||||
|
|
||||||
|
# Because this is a plugin, we need this for testing and development. This can be disabled when using the plugin in your project directly.
|
||||||
|
option(tst_ScreenPlayWeather "Builds TextProject" ON)
|
||||||
|
|
||||||
|
set(QML # cmake-format: sortable
|
||||||
|
src/TestMain.qml)
|
||||||
|
|
||||||
|
set(QML_PLUGIN_SOURCES # cmake-format: sortable
|
||||||
|
src/screenplayweather.cpp)
|
||||||
|
|
||||||
|
set(QML_PLUGIN_HEADER # cmake-format: sortable
|
||||||
|
src/screenplayweather.h src/day.h)
|
||||||
|
|
||||||
|
qt_add_library(${PROJECT_NAME} STATIC)
|
||||||
|
target_link_libraries(${PROJECT_NAME} PUBLIC ScreenPlayUtil)
|
||||||
|
target_include_directories(${PROJECT_NAME} PUBLIC src/)
|
||||||
|
|
||||||
|
qt_add_qml_module(
|
||||||
|
${PROJECT_NAME}
|
||||||
|
URI
|
||||||
|
${PROJECT_NAME}
|
||||||
|
OUTPUT_DIRECTORY
|
||||||
|
${CMAKE_BINARY_DIR}/bin/${PROJECT_NAME}
|
||||||
|
VERSION
|
||||||
|
1.0
|
||||||
|
QML_FILES
|
||||||
|
${QML}
|
||||||
|
SOURCES
|
||||||
|
${QML_PLUGIN_SOURCES}
|
||||||
|
${QML_PLUGIN_HEADER})
|
||||||
|
|
||||||
|
if(${tst_ScreenPlayWeather})
|
||||||
|
qt_add_executable(tst_ScreenPlayWeather src/TestMain.cpp)
|
||||||
|
target_link_libraries(tst_ScreenPlayWeather PRIVATE Qt6::Quick ${PROJECT_NAME}plugin)
|
||||||
|
target_compile_definitions(tst_ScreenPlayWeather PRIVATE $<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:QT_QML_DEBUG>)
|
||||||
|
endif()
|
1
ScreenPlayWeather/Readme.md
Normal file
1
ScreenPlayWeather/Readme.md
Normal file
@ -0,0 +1 @@
|
|||||||
|
https://open-meteo.com/en/docs
|
26
ScreenPlayWeather/src/TestMain.cpp
Normal file
26
ScreenPlayWeather/src/TestMain.cpp
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#include <QGuiApplication>
|
||||||
|
#include <QQmlApplicationEngine>
|
||||||
|
#include <QVersionNumber>
|
||||||
|
#include <QtQml/qqmlextensionplugin.h>
|
||||||
|
|
||||||
|
Q_IMPORT_QML_PLUGIN(ScreenPlayWeatherPlugin)
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
QGuiApplication app(argc, argv);
|
||||||
|
|
||||||
|
QQmlApplicationEngine engine;
|
||||||
|
// The first subfolder is the libraryName followed by the regular
|
||||||
|
// folder strucutre: LibararyName/Subfolder
|
||||||
|
const QUrl url(u"qrc:/ScreenPlayWeather/src/TestMain.qml"_qs);
|
||||||
|
QObject::connect(
|
||||||
|
&engine, &QQmlApplicationEngine::objectCreated,
|
||||||
|
&app, [url](QObject* obj, const QUrl& objUrl) {
|
||||||
|
if (!obj && url == objUrl)
|
||||||
|
QCoreApplication::exit(-1);
|
||||||
|
},
|
||||||
|
Qt::QueuedConnection);
|
||||||
|
engine.load(url);
|
||||||
|
|
||||||
|
return app.exec();
|
||||||
|
}
|
96
ScreenPlayWeather/src/TestMain.qml
Normal file
96
ScreenPlayWeather/src/TestMain.qml
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
import QtQuick
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import QtQuick.Controls
|
||||||
|
import QtQuick.Controls.Material
|
||||||
|
import ScreenPlayWeather 1.0
|
||||||
|
|
||||||
|
Window {
|
||||||
|
id: root
|
||||||
|
width: 1366
|
||||||
|
height: 768
|
||||||
|
visible: true
|
||||||
|
title: qsTr("ScreenPlayWeather")
|
||||||
|
|
||||||
|
ScreenPlayWeather {
|
||||||
|
id: weather
|
||||||
|
city: "Friedrichshafen"
|
||||||
|
onReady: {
|
||||||
|
|
||||||
|
rp.model = weather.days
|
||||||
|
print("onReady" ,weather.days.count)
|
||||||
|
// for (var i = 0; i < rp.count; i++) {
|
||||||
|
// rp.itemAt(i).day = weather.getDay(i)
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ColumnLayout {
|
||||||
|
anchors.fill: parent
|
||||||
|
anchors.margins: 20
|
||||||
|
TextField {
|
||||||
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
onEditingFinished: weather.setCity(text)
|
||||||
|
text: "Friedrichshafen"
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
text: "longtitude: " + weather.longtitude + " - latitude: "
|
||||||
|
+ weather.latitude + " - elevation: " + weather.elevation
|
||||||
|
+ "m - population: " + weather.population
|
||||||
|
}
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
Repeater {
|
||||||
|
id: rp
|
||||||
|
onCountChanged: print(count)
|
||||||
|
ColumnLayout {
|
||||||
|
id: cl
|
||||||
|
spacing: 20
|
||||||
|
Text {
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
text: day + "\nday"
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
text: dateTime + "\ndateTime"
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
text: sunrise + "\nsunrise"
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
text: sunset + "\nsunset"
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
text: weatherCode + "\nweatherCode"
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
text:temperature_2m_min + "\ntemperature_2m_min"
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
text: temperature_2m_max + "\ntemperature_2m_max"
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
text: precipitationHours + "\nprecipitationHours"
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
text: precipitationSum + "\nprecipitationSum"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Button {
|
||||||
|
text: "getDay"
|
||||||
|
onClicked: {
|
||||||
|
var day = weather.getDay(1)
|
||||||
|
print("weatherCode:", day.weatherCode, day.precipitationSum)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
20
ScreenPlayWeather/src/day.h
Normal file
20
ScreenPlayWeather/src/day.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "ScreenPlayUtil/PropertyHelpers.h"
|
||||||
|
#include <QDateTime>
|
||||||
|
#include <QObject>
|
||||||
|
#include <QQmlEngine>
|
||||||
|
|
||||||
|
class Day : public QObject {
|
||||||
|
Q_OBJECT
|
||||||
|
QML_ELEMENT
|
||||||
|
public:
|
||||||
|
W_PROPERTY(int, day)
|
||||||
|
W_PROPERTY(QDateTime, dateTime)
|
||||||
|
W_PROPERTY(QDateTime, sunrise)
|
||||||
|
W_PROPERTY(QDateTime, sunset)
|
||||||
|
W_PROPERTY_DEFAULT(int, weatherCode, 0)
|
||||||
|
W_PROPERTY_DEFAULT(float, temperature_2m_min, 0.0f)
|
||||||
|
W_PROPERTY_DEFAULT(float, temperature_2m_max, 0.0f)
|
||||||
|
W_PROPERTY_DEFAULT(int, precipitationHours, 0)
|
||||||
|
W_PROPERTY_DEFAULT(float, precipitationSum, 0.0f)
|
||||||
|
};
|
145
ScreenPlayWeather/src/screenplayweather.cpp
Normal file
145
ScreenPlayWeather/src/screenplayweather.cpp
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
#include "screenplayweather.h"
|
||||||
|
|
||||||
|
#include "ScreenPlayUtil/util.h"
|
||||||
|
#include <QJsonDocument>
|
||||||
|
#include <QJsonObject>
|
||||||
|
#include <QNetworkReply>
|
||||||
|
#include <QNetworkRequest>
|
||||||
|
#include <QUrlQuery>
|
||||||
|
|
||||||
|
ScreenPlayWeather::ScreenPlayWeather()
|
||||||
|
: m_days(this)
|
||||||
|
{
|
||||||
|
|
||||||
|
QObject::connect(this, &ScreenPlayWeather::cityChanged, this, &ScreenPlayWeather::updateLatitudeLongtitude);
|
||||||
|
QObject::connect(this, &ScreenPlayWeather::latitudeLongtitudeChanged, this, &ScreenPlayWeather::update);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenPlayWeather::updateLatitudeLongtitude(const QString& city)
|
||||||
|
{
|
||||||
|
auto request = defaultRequest();
|
||||||
|
QUrl url = m_geocoding_open_metro_v1 + "search";
|
||||||
|
QUrlQuery parameter;
|
||||||
|
parameter.addQueryItem("name", city);
|
||||||
|
url.setQuery(parameter);
|
||||||
|
request.setUrl(url);
|
||||||
|
auto* reply = m_networkAccessManager.get(request);
|
||||||
|
|
||||||
|
QObject::connect(reply, &QNetworkReply::readyRead, this, [this, reply]() {
|
||||||
|
const QByteArray data = reply->readAll();
|
||||||
|
if (data.size() <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const auto msgOpt = ScreenPlayUtil::parseQByteArrayToQJsonObject(data);
|
||||||
|
if (!msgOpt.has_value())
|
||||||
|
return;
|
||||||
|
|
||||||
|
auto results = msgOpt->value("results").toArray();
|
||||||
|
if (results.size() == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
QJsonObject result = results.first().toObject();
|
||||||
|
if (result.contains("latitude") && result.contains("longitude")) {
|
||||||
|
setLatitude(result.value("latitude").toDouble());
|
||||||
|
setLongtitude(result.value("longitude").toDouble());
|
||||||
|
emit latitudeLongtitudeChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result.contains("elevation"))
|
||||||
|
setElevation(result.value("elevation").toInt());
|
||||||
|
if (result.contains("population"))
|
||||||
|
setPopulation(result.value("population").toInt());
|
||||||
|
});
|
||||||
|
QObject::connect(reply, &QNetworkReply::finished, this, []() { qInfo() << "finished!"; });
|
||||||
|
QObject::connect(reply, &QNetworkReply::errorOccurred, this, []() { qInfo() << "errorOccurred!"; });
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenPlayWeather::update()
|
||||||
|
{
|
||||||
|
auto request = defaultRequest();
|
||||||
|
const QString timezone = "Europe%2FLondon";
|
||||||
|
const QString temperature_unit = QVariant::fromValue(m_temperatureUnit).toString().toLower();
|
||||||
|
QString query = QString(
|
||||||
|
"forecast?latitude=%1&"
|
||||||
|
"longitude=%2&"
|
||||||
|
"hourly=temperature_2m&"
|
||||||
|
"daily=weathercode,"
|
||||||
|
"temperature_2m_max,"
|
||||||
|
"temperature_2m_min,"
|
||||||
|
"sunrise,sunset,"
|
||||||
|
"precipitation_sum,"
|
||||||
|
"precipitation_hours&"
|
||||||
|
"temperature_unit=celsius&"
|
||||||
|
"timezone=%3")
|
||||||
|
.arg(m_latitude)
|
||||||
|
.arg(m_longtitude)
|
||||||
|
.arg(timezone);
|
||||||
|
|
||||||
|
QUrl url = m_weather_open_metro_v1 + query;
|
||||||
|
request.setUrl(url);
|
||||||
|
qInfo() << url;
|
||||||
|
auto* reply = m_networkAccessManager.get(request);
|
||||||
|
|
||||||
|
QObject::connect(reply, &QNetworkReply::readyRead, this, [this, reply]() {
|
||||||
|
const QByteArray data = reply->readAll();
|
||||||
|
if (data.size() <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const auto msgOpt = ScreenPlayUtil::parseQByteArrayToQJsonObject(data);
|
||||||
|
if (!msgOpt.has_value())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (msgOpt->contains("error")) {
|
||||||
|
qWarning() << msgOpt->value("reason").toString();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto daily = msgOpt->value("daily").toObject();
|
||||||
|
|
||||||
|
const auto sunrise = daily.value("sunrise").toArray();
|
||||||
|
const auto sunset = daily.value("sunset").toArray();
|
||||||
|
const auto time = daily.value("time").toArray();
|
||||||
|
const auto weathercode = daily.value("weathercode").toArray();
|
||||||
|
const auto temperature_2m_min = daily.value("temperature_2m_min").toArray();
|
||||||
|
const auto temperature_2m_max = daily.value("temperature_2m_max").toArray();
|
||||||
|
const auto precipitation_hours = daily.value("precipitation_hours").toArray();
|
||||||
|
const auto precipitation_sum = daily.value("precipitation_sum").toArray();
|
||||||
|
|
||||||
|
for (int i = 0; i < time.size(); ++i) {
|
||||||
|
auto day = new Day();
|
||||||
|
day->set_day(i);
|
||||||
|
day->set_sunrise(QDateTime::fromString(sunrise.at(i).toString(), m_dataTimeFormat));
|
||||||
|
day->set_sunset(QDateTime::fromString(sunset.at(i).toString(), m_dataTimeFormat));
|
||||||
|
day->set_dateTime(QDateTime::fromString(time.at(i).toString(), m_dataTimeFormat));
|
||||||
|
day->set_weatherCode(weathercode.at(i).toInt());
|
||||||
|
day->set_temperature_2m_min(ScreenPlayUtil::roundDecimalPlaces(temperature_2m_min.at(i).toDouble()));
|
||||||
|
day->set_temperature_2m_max(ScreenPlayUtil::roundDecimalPlaces(temperature_2m_max.at(i).toDouble()));
|
||||||
|
day->set_precipitationHours(precipitation_hours.at(i).toInt());
|
||||||
|
day->set_precipitationSum(ScreenPlayUtil::roundDecimalPlaces(precipitation_sum.at(i).toDouble()));
|
||||||
|
m_days.append(&m_days, std::move(day));
|
||||||
|
}
|
||||||
|
const auto hourly = msgOpt->value("hourly").toObject();
|
||||||
|
emit ready();
|
||||||
|
});
|
||||||
|
QObject::connect(reply, &QNetworkReply::finished, this, []() { qInfo() << "finished!"; });
|
||||||
|
QObject::connect(reply, &QNetworkReply::errorOccurred, this, []() { qInfo() << "errorOccurred!"; });
|
||||||
|
}
|
||||||
|
|
||||||
|
Day* ScreenPlayWeather::getDay(const int index) const
|
||||||
|
{
|
||||||
|
// if ((index >= m_days.count()) || index < 0) {
|
||||||
|
// qWarning() << "Invalid getDay index: " << index;
|
||||||
|
// return nullptr;
|
||||||
|
// }
|
||||||
|
|
||||||
|
return nullptr; // m_days.at(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
QNetworkRequest ScreenPlayWeather::defaultRequest() const
|
||||||
|
{
|
||||||
|
QNetworkRequest request;
|
||||||
|
const QString userAgent = "ScreenPlay";
|
||||||
|
request.setHeader(QNetworkRequest::KnownHeaders::UserAgentHeader, userAgent);
|
||||||
|
request.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, "application/json");
|
||||||
|
return request;
|
||||||
|
}
|
115
ScreenPlayWeather/src/screenplayweather.h
Normal file
115
ScreenPlayWeather/src/screenplayweather.h
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "ScreenPlayUtil/ListPropertyHelper.h"
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QObject>
|
||||||
|
#include <QQmlEngine>
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QSize>
|
||||||
|
#include <QString>
|
||||||
|
#include <QUrl>
|
||||||
|
#include <QtNetwork/QNetworkAccessManager>
|
||||||
|
#include <QtNetwork/QNetworkRequest>
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#include "day.h"
|
||||||
|
|
||||||
|
class ScreenPlayWeather : public QObject {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
Q_PROPERTY(double latitude READ latitude WRITE setLatitude NOTIFY latitudeChanged)
|
||||||
|
Q_PROPERTY(double longtitude READ longtitude WRITE setLongtitude NOTIFY longtitudeChanged)
|
||||||
|
Q_PROPERTY(QString city READ city WRITE setCity NOTIFY cityChanged)
|
||||||
|
Q_PROPERTY(int elevation READ elevation WRITE setElevation NOTIFY elevationChanged)
|
||||||
|
Q_PROPERTY(int population READ population WRITE setPopulation NOTIFY populationChanged)
|
||||||
|
QML_ELEMENT
|
||||||
|
|
||||||
|
LIST_PROPERTY(Day, days)
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit ScreenPlayWeather();
|
||||||
|
|
||||||
|
double latitude() const { return m_latitude; }
|
||||||
|
double longtitude() const { return m_longtitude; }
|
||||||
|
const QString& city() const { return m_city; }
|
||||||
|
int elevation() const { return m_elevation; }
|
||||||
|
int population() const { return m_population; }
|
||||||
|
|
||||||
|
enum class TemperatureUnit {
|
||||||
|
Celsius,
|
||||||
|
Fahrenheit
|
||||||
|
};
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
Day* getDay(const int index) const;
|
||||||
|
|
||||||
|
void setLatitude(double latitude)
|
||||||
|
{
|
||||||
|
if (qFuzzyCompare(m_latitude, latitude))
|
||||||
|
return;
|
||||||
|
m_latitude = latitude;
|
||||||
|
emit latitudeChanged(m_latitude);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setLongtitude(double longtitude)
|
||||||
|
{
|
||||||
|
if (qFuzzyCompare(m_longtitude, longtitude))
|
||||||
|
return;
|
||||||
|
m_longtitude = longtitude;
|
||||||
|
emit longtitudeChanged(m_longtitude);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setCity(const QString& city)
|
||||||
|
{
|
||||||
|
if (m_city == city)
|
||||||
|
return;
|
||||||
|
m_city = city;
|
||||||
|
emit cityChanged(m_city);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setElevation(int elevation)
|
||||||
|
{
|
||||||
|
if (m_elevation == elevation)
|
||||||
|
return;
|
||||||
|
m_elevation = elevation;
|
||||||
|
emit elevationChanged(m_elevation);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setPopulation(int population)
|
||||||
|
{
|
||||||
|
if (m_population == population)
|
||||||
|
return;
|
||||||
|
m_population = population;
|
||||||
|
emit populationChanged(m_population);
|
||||||
|
}
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void updateLatitudeLongtitude(const QString& city);
|
||||||
|
void update();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void latitudeChanged(double latitude);
|
||||||
|
void longtitudeChanged(double longtitude);
|
||||||
|
void cityChanged(const QString& city);
|
||||||
|
void latitudeLongtitudeChanged();
|
||||||
|
void elevationChanged(int elevation);
|
||||||
|
void populationChanged(int population);
|
||||||
|
void ready();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QNetworkRequest defaultRequest() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
QNetworkAccessManager m_networkAccessManager;
|
||||||
|
double m_latitude = 0.0l;
|
||||||
|
double m_longtitude = 0.0l;
|
||||||
|
QString m_city;
|
||||||
|
const QString m_geocoding_open_metro_v1 = "https://geocoding-api.open-meteo.com/v1/";
|
||||||
|
const QString m_weather_open_metro_v1 = "https://api.open-meteo.com/v1/";
|
||||||
|
const QString m_dataTimeFormat = "yyyy-MM-ddTmm:ss";
|
||||||
|
int m_elevation;
|
||||||
|
int m_population;
|
||||||
|
int FORCAST_DAYS = 6;
|
||||||
|
TemperatureUnit m_temperatureUnit = TemperatureUnit::Celsius;
|
||||||
|
};
|
@ -34,6 +34,8 @@ target_link_libraries(
|
|||||||
${PROJECT_NAME}
|
${PROJECT_NAME}
|
||||||
PRIVATE ScreenPlaySDK
|
PRIVATE ScreenPlaySDK
|
||||||
ScreenPlayUtil
|
ScreenPlayUtil
|
||||||
|
ScreenPlayWeatherplugin
|
||||||
|
ScreenPlaySysInfoplugin
|
||||||
Qt6::Quick
|
Qt6::Quick
|
||||||
Qt6::Gui
|
Qt6::Gui
|
||||||
Qt6::Widgets
|
Qt6::Widgets
|
||||||
@ -49,6 +51,8 @@ qt_add_qml_module(
|
|||||||
${PROJECT_NAME}
|
${PROJECT_NAME}
|
||||||
VERSION
|
VERSION
|
||||||
1.0
|
1.0
|
||||||
|
OUTPUT_DIRECTORY
|
||||||
|
${CMAKE_BINARY_DIR}/bin/${PROJECT_NAME}
|
||||||
QML_FILES
|
QML_FILES
|
||||||
${QML})
|
${QML})
|
||||||
|
|
||||||
|
@ -5,6 +5,9 @@
|
|||||||
|
|
||||||
#include "src/widgetwindow.h"
|
#include "src/widgetwindow.h"
|
||||||
|
|
||||||
|
Q_IMPORT_QML_PLUGIN(ScreenPlayWeatherPlugin)
|
||||||
|
Q_IMPORT_QML_PLUGIN(ScreenPlaySysInfoPlugin)
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
QtWebEngineQuick::initialize();
|
QtWebEngineQuick::initialize();
|
||||||
|
@ -64,7 +64,9 @@ qt_add_qml_module(
|
|||||||
${SOURCES}
|
${SOURCES}
|
||||||
${HEADER}
|
${HEADER}
|
||||||
VERSION
|
VERSION
|
||||||
1.0)
|
1.0
|
||||||
|
OUTPUT_DIRECTORY
|
||||||
|
${CMAKE_BINARY_DIR}/bin/${PROJECT_NAME})
|
||||||
|
|
||||||
if(${SCREENPLAY_STEAM})
|
if(${SCREENPLAY_STEAM})
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
|
@ -3,8 +3,7 @@ project(Tools LANGUAGES CXX)
|
|||||||
file(GLOB PYTHON *.py)
|
file(GLOB PYTHON *.py)
|
||||||
|
|
||||||
set(FILES # cmake-format: sortable
|
set(FILES # cmake-format: sortable
|
||||||
Installer/package.xml
|
Installer/package.xml Installer/installscript.qs)
|
||||||
Installer/installscript.qs)
|
|
||||||
|
|
||||||
add_custom_target(
|
add_custom_target(
|
||||||
${PROJECT_NAME}
|
${PROJECT_NAME}
|
||||||
|
Loading…
Reference in New Issue
Block a user