mirror of
https://gitlab.com/kelteseth/ScreenPlay.git
synced 2024-11-22 10:42:29 +01:00
Implement basic installed screens and remove steam api for now
This commit is contained in:
parent
0e564a34c6
commit
a65a1f85a4
@ -5,7 +5,9 @@ CONFIG += c++14
|
||||
|
||||
SOURCES += main.cpp \
|
||||
src/screenplay.cpp \
|
||||
src/steamworkshop.cpp
|
||||
src/steamworkshop.cpp \
|
||||
src/installedlistmodel.cpp \
|
||||
src/screenplayitem.cpp
|
||||
|
||||
RESOURCES += qml.qrc
|
||||
|
||||
@ -33,7 +35,9 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin
|
||||
|
||||
HEADERS += \
|
||||
src/screenplay.h \
|
||||
src/steamworkshop.h
|
||||
src/steamworkshop.h \
|
||||
src/installedlistmodel.h \
|
||||
src/screenplayitem.h
|
||||
|
||||
INCLUDEPATH += $$PWD/ThirdParty/Steam/
|
||||
INCLUDEPATH += $$PWD/src/
|
||||
|
19
main.cpp
19
main.cpp
@ -8,8 +8,12 @@
|
||||
#include <QUrl>
|
||||
#include <QWindow>
|
||||
#include <qt_windows.h>
|
||||
#include <QQmlContext>
|
||||
#include <QModelIndex>
|
||||
#include <QVariant>
|
||||
|
||||
#include "screenplay.h"
|
||||
#include "installedlistmodel.h"
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
@ -20,9 +24,20 @@ int main(int argc, char* argv[])
|
||||
QCoreApplication::setApplicationName("ScreenPlay");
|
||||
QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
|
||||
|
||||
QQmlApplicationEngine mainWindow(QUrl(QStringLiteral("qrc:/qml/main.qml")));
|
||||
InstalledListModel ilm;
|
||||
ilm.setData(QModelIndex(),QVariant("ascb"),0);
|
||||
|
||||
QQmlApplicationEngine mainWindow;
|
||||
mainWindow.rootContext()->setContextProperty("installedListModel", &ilm);
|
||||
|
||||
mainWindow.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
|
||||
|
||||
|
||||
//ScreenPlay sp(GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN));
|
||||
|
||||
return app.exec();
|
||||
int status = app.exec();
|
||||
|
||||
//Shutdown
|
||||
|
||||
return status;
|
||||
}
|
||||
|
2
qml.qrc
2
qml.qrc
@ -20,5 +20,7 @@
|
||||
<file>assets/icons/icon_share.svg</file>
|
||||
<file>assets/icons/icon_volume.svg</file>
|
||||
<file>assets/icons/icon_workshop.svg</file>
|
||||
<file>qml/Components/ScreenPlayItem.qml</file>
|
||||
<file>qml/Components/Sidebar.qml</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
@ -1,6 +1,27 @@
|
||||
import QtQuick 2.0
|
||||
import QtQuick 2.7
|
||||
import QtQml.Models 2.2
|
||||
|
||||
|
||||
Page {
|
||||
id:pageInstalled
|
||||
pageName: "Installed"
|
||||
|
||||
GridView {
|
||||
id: gridView
|
||||
anchors.fill: parent
|
||||
cellWidth: 320
|
||||
cellHeight: 200
|
||||
anchors.margins: 20
|
||||
focus: true
|
||||
|
||||
delegate: ScreenPlayItem {
|
||||
|
||||
customTitle: title
|
||||
}
|
||||
|
||||
|
||||
model: installedListModel
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -4,6 +4,7 @@ import QtQuick.Controls 2.2
|
||||
Rectangle {
|
||||
id:navigation
|
||||
height:60
|
||||
clip: true
|
||||
width: 1366
|
||||
|
||||
signal changeTab(string name)
|
||||
@ -38,7 +39,7 @@ Rectangle {
|
||||
|
||||
NavigationItem {
|
||||
id: navWorkshop
|
||||
state: "active"
|
||||
state: "inactive"
|
||||
name: "Workshop"
|
||||
iconSource: "qrc:/assets/icons/icon_workshop.svg"
|
||||
onTabClicked: navigation.onTabChanged(name)
|
||||
@ -46,7 +47,7 @@ Rectangle {
|
||||
|
||||
NavigationItem {
|
||||
id: navInstalled
|
||||
state: "inactive"
|
||||
state: "active"
|
||||
name: "Installed"
|
||||
iconSource: "qrc:/assets/icons/icon_installed.svg"
|
||||
onTabClicked: navigation.onTabChanged(name)
|
||||
@ -63,27 +64,5 @@ Rectangle {
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
id:createScreenPlay
|
||||
width: txtcreateScreenPlay.contentWidth
|
||||
|
||||
anchors{
|
||||
top:parent.top
|
||||
right: parent.right
|
||||
rightMargin: 20
|
||||
bottom: parent.bottom
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
|
||||
Text {
|
||||
id: txtcreateScreenPlay
|
||||
text: qsTr("+ Create ScreenPlay")
|
||||
anchors.centerIn: parent
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -44,7 +44,7 @@ Item {
|
||||
anchors.left: icon.right
|
||||
anchors.leftMargin: 10
|
||||
text: name
|
||||
font.pointSize: 16
|
||||
font.pointSize: 14
|
||||
color: "#626262"
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
@ -136,6 +136,7 @@ Item {
|
||||
NumberAnimation {
|
||||
properties: "anchors.bottomMargin"
|
||||
duration: 100
|
||||
easing.type: Easing.InOutQuad
|
||||
}
|
||||
},
|
||||
Transition {
|
||||
@ -144,6 +145,7 @@ Item {
|
||||
NumberAnimation {
|
||||
properties: "anchors.bottomMargin"
|
||||
duration: 100
|
||||
easing.type: Easing.InOutQuad
|
||||
}
|
||||
}
|
||||
]
|
||||
|
31
qml/Components/ScreenPlayItem.qml
Normal file
31
qml/Components/ScreenPlayItem.qml
Normal file
@ -0,0 +1,31 @@
|
||||
import QtQuick 2.0
|
||||
|
||||
Item {
|
||||
id:screenPlayItem
|
||||
width: 320
|
||||
height: 180
|
||||
|
||||
property string customTitle: "name here"
|
||||
|
||||
Rectangle
|
||||
{
|
||||
id: rectangle
|
||||
color: "white"
|
||||
radius: 23
|
||||
anchors {
|
||||
fill: parent
|
||||
margins:5
|
||||
}
|
||||
|
||||
Text {
|
||||
id: text1
|
||||
text: customTitle
|
||||
renderType: Text.QtRendering
|
||||
wrapMode: Text.WrapAnywhere
|
||||
anchors.fill: parent
|
||||
font.pixelSize: 18
|
||||
anchors.margins: 10
|
||||
}
|
||||
}
|
||||
|
||||
}
|
107
qml/Components/Sidebar.qml
Normal file
107
qml/Components/Sidebar.qml
Normal file
@ -0,0 +1,107 @@
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects 1.0
|
||||
import QtQuick.Controls 2.2
|
||||
|
||||
Item {
|
||||
id:sidebar
|
||||
height: 768
|
||||
width:400
|
||||
state: "inactive"
|
||||
|
||||
Item {
|
||||
id: sidebarWrapper
|
||||
|
||||
anchors {
|
||||
top:sidebar.top
|
||||
right:sidebar.right
|
||||
bottom:sidebar.bottom
|
||||
left:sidebar.left
|
||||
}
|
||||
Rectangle {
|
||||
id:sidebarBackground
|
||||
color: "grey"
|
||||
anchors {
|
||||
top:parent.top
|
||||
right:parent.right
|
||||
bottom:parent.bottom
|
||||
left:parent.left
|
||||
leftMargin: 5
|
||||
}
|
||||
|
||||
Button {
|
||||
id: button
|
||||
text: qsTr("Button")
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
onClicked: {
|
||||
sidebar.state = sidebar.state == "active" ? "inactive" : "active"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id:shadow
|
||||
anchors {
|
||||
top:parent.top
|
||||
right:sidebarBackground.left
|
||||
bottom:parent.bottom
|
||||
left:parent.left
|
||||
}
|
||||
|
||||
|
||||
LinearGradient {
|
||||
anchors.fill: parent
|
||||
start: Qt.point(0, 0)
|
||||
end: Qt.point(5, 0)
|
||||
gradient: Gradient {
|
||||
GradientStop { position: 0.0; color: "#00000000" }
|
||||
GradientStop { position: 1.0; color: "#22000000" }
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
states: [
|
||||
State {
|
||||
name: "active"
|
||||
|
||||
PropertyChanges {
|
||||
target: sidebarWrapper
|
||||
anchors.leftMargin: 0
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "inactive"
|
||||
|
||||
PropertyChanges {
|
||||
target: sidebarWrapper
|
||||
anchors.leftMargin: sidebar.width
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
transitions: [
|
||||
Transition {
|
||||
to: "active"
|
||||
|
||||
NumberAnimation {
|
||||
properties: "anchors.leftMargin"
|
||||
duration: 500
|
||||
easing.type: Easing.InOutQuad
|
||||
}
|
||||
},
|
||||
Transition {
|
||||
to: "inactive"
|
||||
|
||||
NumberAnimation {
|
||||
properties: "anchors.leftMargin"
|
||||
duration: 500
|
||||
easing.type: Easing.InOutQuad
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
}
|
36
qml/main.qml
36
qml/main.qml
@ -12,6 +12,31 @@ Window {
|
||||
visible: true
|
||||
width: 1366
|
||||
height: 768
|
||||
Component.onCompleted: installedListModel.loadDrives()
|
||||
|
||||
|
||||
|
||||
Loader {
|
||||
id: pageLoader
|
||||
anchors {
|
||||
top: nav.bottom
|
||||
right: parent.right
|
||||
bottom: parent.bottom
|
||||
left: parent.left
|
||||
}
|
||||
source: "qrc:/qml/Components/Installed.qml"
|
||||
}
|
||||
|
||||
Sidebar {
|
||||
id: sidebar
|
||||
width:400
|
||||
anchors {
|
||||
top:parent.top
|
||||
right:parent.right
|
||||
bottom:parent.bottom
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Navigation {
|
||||
id: nav
|
||||
@ -22,15 +47,4 @@ Window {
|
||||
}
|
||||
onChangeTab: pageLoader.setSource("qrc:/qml/Components/"+name+".qml")
|
||||
}
|
||||
|
||||
Loader {
|
||||
id: pageLoader
|
||||
anchors {
|
||||
top: nav.bottom
|
||||
right: parent.right
|
||||
bottom: parent.bottom
|
||||
left: parent.left
|
||||
}
|
||||
source: "qrc:/qml/Components/Workshop.qml"
|
||||
}
|
||||
}
|
||||
|
90
src/installedlistmodel.cpp
Normal file
90
src/installedlistmodel.cpp
Normal file
@ -0,0 +1,90 @@
|
||||
#include "installedlistmodel.h"
|
||||
|
||||
InstalledListModel::InstalledListModel(QObject* parent)
|
||||
: QAbstractListModel(parent)
|
||||
{
|
||||
}
|
||||
|
||||
int InstalledListModel::rowCount(const QModelIndex& parent) const
|
||||
{
|
||||
// For list models only the root node (an invalid parent) should return the
|
||||
// list's size. For all
|
||||
// other (valid) parents, rowCount() should return 0 so that it does not
|
||||
// become a tree model.
|
||||
return _screenPlayFiles.count();
|
||||
}
|
||||
|
||||
QVariant InstalledListModel::data(const QModelIndex& index, int role) const
|
||||
{
|
||||
if (!index.isValid())
|
||||
return QVariant();
|
||||
|
||||
if (index.row() < rowCount())
|
||||
switch (role) {
|
||||
case TitleRole:
|
||||
return _screenPlayFiles.at(index.row())._title;
|
||||
case ImageRole:
|
||||
return _screenPlayFiles.at(index.row())._description;
|
||||
default:
|
||||
return QVariant();
|
||||
}
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
QHash<int, QByteArray> InstalledListModel::roleNames() const
|
||||
{
|
||||
static const QHash<int, QByteArray> roles{
|
||||
{ TitleRole, "title" },
|
||||
{ ImageRole, "image" },
|
||||
};
|
||||
return roles;
|
||||
}
|
||||
|
||||
void InstalledListModel::append(const QJsonObject obj)
|
||||
{
|
||||
int row = 0;
|
||||
|
||||
beginInsertRows(QModelIndex(), row, row);
|
||||
|
||||
ScreenPlayFile tmpFile(obj);
|
||||
_screenPlayFiles.append(tmpFile);
|
||||
|
||||
endInsertRows();
|
||||
}
|
||||
|
||||
void InstalledListModel::loadDrives()
|
||||
{
|
||||
QString writablePath = QStandardPaths::writableLocation(QStandardPaths::StandardLocation::DataLocation);
|
||||
|
||||
if (!QDir(writablePath).exists()) {
|
||||
if (!QDir().mkdir(writablePath)) {
|
||||
qWarning("ERROR: Cloud not create install dir");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
QString tmp(writablePath + "/Installed/");
|
||||
QJsonDocument jsonProject;
|
||||
QJsonParseError parseError;
|
||||
|
||||
QFileInfoList list = QDir(tmp).entryInfoList(QDir::NoDotAndDotDot | QDir::AllDirs);
|
||||
QString tmpPath;
|
||||
|
||||
for (auto&& item : list) {
|
||||
tmpPath = tmp + item.baseName() + "/project.json";
|
||||
|
||||
if (!QFile(tmpPath).exists())
|
||||
continue;
|
||||
|
||||
QFile projectConfig;
|
||||
projectConfig.setFileName(tmpPath);
|
||||
projectConfig.open(QIODevice::ReadOnly | QIODevice::Text);
|
||||
QString projectConfigData = projectConfig.readAll();
|
||||
jsonProject = QJsonDocument::fromJson(projectConfigData.toUtf8(), &parseError);
|
||||
|
||||
if (!(parseError.error == QJsonParseError::NoError))
|
||||
continue;
|
||||
|
||||
append(jsonProject.object());
|
||||
}
|
||||
}
|
75
src/installedlistmodel.h
Normal file
75
src/installedlistmodel.h
Normal file
@ -0,0 +1,75 @@
|
||||
#ifndef INSTALLEDLISTMODEL_H
|
||||
#define INSTALLEDLISTMODEL_H
|
||||
|
||||
#include <QAbstractListModel>
|
||||
#include <QByteArray>
|
||||
#include <QDebug>
|
||||
#include <QDir>
|
||||
#include <QDirIterator>
|
||||
#include <QFile>
|
||||
#include <QJsonArray>
|
||||
#include <QJsonDocument>
|
||||
#include <QJsonObject>
|
||||
#include <QList>
|
||||
#include <QStandardPaths>
|
||||
#include <QString>
|
||||
#include <QUrl>
|
||||
#include <QtConcurrent/QtConcurrent>
|
||||
|
||||
class ScreenPlayFile;
|
||||
|
||||
class InstalledListModel : public QAbstractListModel {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit InstalledListModel(QObject* parent = 0);
|
||||
|
||||
// Basic functionality:
|
||||
int rowCount(const QModelIndex& parent = QModelIndex()) const override;
|
||||
QVariant data(const QModelIndex& index,
|
||||
int role = Qt::DisplayRole) const override;
|
||||
void append(const QJsonObject);
|
||||
QHash<int, QByteArray> roleNames() const;
|
||||
|
||||
Q_INVOKABLE void loadDrives();
|
||||
|
||||
enum InstalledRole {
|
||||
TitleRole,
|
||||
ImageRole,
|
||||
|
||||
};
|
||||
Q_ENUM(InstalledRole)
|
||||
|
||||
private:
|
||||
QList<ScreenPlayFile> _screenPlayFiles;
|
||||
};
|
||||
|
||||
class ScreenPlayFile {
|
||||
|
||||
public:
|
||||
ScreenPlayFile();
|
||||
ScreenPlayFile(QJsonObject obj)
|
||||
{
|
||||
if (obj.contains("description"))
|
||||
_description = obj.value("description");
|
||||
|
||||
if (obj.contains("file"))
|
||||
_file = obj.value("file");
|
||||
|
||||
if (obj.contains("preview"))
|
||||
_preview = obj.value("preview");
|
||||
|
||||
if (obj.contains("title"))
|
||||
_title = obj.value("title");
|
||||
}
|
||||
|
||||
QVariant _description = "as";
|
||||
QVariant _file;
|
||||
QVariant _preview;
|
||||
QVariant _title= "aass";
|
||||
QUrl _absolutePath;
|
||||
|
||||
QVariantList _tags; //TODO: Implement me!
|
||||
};
|
||||
|
||||
#endif // INSTALLEDLISTMODEL_H
|
@ -21,7 +21,7 @@ ScreenPlay::ScreenPlay(QWindow* parent)
|
||||
|
||||
ScreenPlay::ScreenPlay(int width, int height)
|
||||
{
|
||||
this->setHeight(height);
|
||||
this->setHeight(height);
|
||||
this->setWidth(width);
|
||||
|
||||
this->hwnd = (HWND)this->winId();
|
||||
|
6
src/screenplayitem.cpp
Normal file
6
src/screenplayitem.cpp
Normal file
@ -0,0 +1,6 @@
|
||||
#include "screenplayitem.h"
|
||||
|
||||
ScreenPlayItem::ScreenPlayItem(QObject *parent) : QObject(parent)
|
||||
{
|
||||
|
||||
}
|
39
src/screenplayitem.h
Normal file
39
src/screenplayitem.h
Normal file
@ -0,0 +1,39 @@
|
||||
#ifndef SCREENPLAYITEM_H
|
||||
#define SCREENPLAYITEM_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QVariant>
|
||||
|
||||
class ScreenPlayItem : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
Q_PROPERTY(QVariant name READ name WRITE setName NOTIFY nameChanged);
|
||||
|
||||
|
||||
QVariant m_name;
|
||||
|
||||
public:
|
||||
explicit ScreenPlayItem(QObject *parent = 0);
|
||||
|
||||
QVariant name() const
|
||||
{
|
||||
return m_name;
|
||||
}
|
||||
|
||||
signals:
|
||||
|
||||
void nameChanged(QVariant name);
|
||||
|
||||
public slots:
|
||||
void setName(QVariant name)
|
||||
{
|
||||
if (m_name == name)
|
||||
return;
|
||||
|
||||
m_name = name;
|
||||
emit nameChanged(name);
|
||||
}
|
||||
};
|
||||
|
||||
#endif // SCREENPLAYITEM_H
|
Loading…
Reference in New Issue
Block a user