[Backend+UI] Added hover to show time and made backend handling better.
This commit is contained in:
parent
975a548ef6
commit
1aa3e6f66b
|
@ -1,4 +1,4 @@
|
||||||
#ifndef DirectMpvPlayerBackend_Hc
|
#ifndef DirectMpvPlayerBackend_H
|
||||||
#define DirectMpvPlayerBackend_H
|
#define DirectMpvPlayerBackend_H
|
||||||
|
|
||||||
#include <mpv/client.h>
|
#include <mpv/client.h>
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
|
|
||||||
#include "MpvPlayerBackend.h"
|
#include "MpvPlayerBackend.h"
|
||||||
|
|
||||||
|
#ifndef DISABLE_MpvPlayerBackend
|
||||||
|
|
||||||
#include "utils.hpp"
|
#include "utils.hpp"
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QOpenGLContext>
|
#include <QOpenGLContext>
|
||||||
|
@ -183,6 +185,7 @@ MpvPlayerBackend::~MpvPlayerBackend()
|
||||||
{
|
{
|
||||||
printf("Shutting down...\n");
|
printf("Shutting down...\n");
|
||||||
Utils::SetDPMS(true);
|
Utils::SetDPMS(true);
|
||||||
|
command("quit-watch-later");
|
||||||
mpv_render_context_free(mpv_gl);
|
mpv_render_context_free(mpv_gl);
|
||||||
mpv_terminate_destroy(mpv);
|
mpv_terminate_destroy(mpv);
|
||||||
printf("MPV terminated.\n");
|
printf("MPV terminated.\n");
|
||||||
|
@ -580,3 +583,5 @@ MpvPlayerBackend::createRenderer() const
|
||||||
window()->setPersistentSceneGraph(true);
|
window()->setPersistentSceneGraph(true);
|
||||||
return new MpvRenderer(const_cast<MpvPlayerBackend*>(this));
|
return new MpvRenderer(const_cast<MpvPlayerBackend*>(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -1,8 +1,15 @@
|
||||||
#ifndef MpvPlayerBackend_Hc
|
#ifndef MpvPlayerBackend_H
|
||||||
#define MpvPlayerBackend_H
|
#define MpvPlayerBackend_H
|
||||||
|
|
||||||
#include <mpv/client.h>
|
#include <mpv/client.h>
|
||||||
#include <mpv/qthelper.hpp>
|
#include <mpv/qthelper.hpp>
|
||||||
|
|
||||||
|
#if MPV_CLIENT_API_VERSION <= MPV_MAKE_VERSION(1, 28)
|
||||||
|
#define DISABLE_MpvPlayerBackend
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef DISABLE_MpvPlayerBackend
|
||||||
|
|
||||||
#include <mpv/render_gl.h>
|
#include <mpv/render_gl.h>
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
@ -11,6 +18,7 @@
|
||||||
|
|
||||||
#include "backendinterface.hpp"
|
#include "backendinterface.hpp"
|
||||||
#include "enums.hpp"
|
#include "enums.hpp"
|
||||||
|
#include "utils.hpp"
|
||||||
|
|
||||||
class MpvRenderer;
|
class MpvRenderer;
|
||||||
|
|
||||||
|
@ -85,3 +93,4 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
46
src/main.cpp
46
src/main.cpp
|
@ -54,8 +54,11 @@ catchUnixSignals(std::initializer_list<int> quitSignals)
|
||||||
int
|
int
|
||||||
main(int argc, char* argv[])
|
main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
|
#ifdef DISABLE_MpvPlayerBackend
|
||||||
|
Enums::Backends backend = Enums::Backends::DirectMpvBackend;
|
||||||
|
#else
|
||||||
Enums::Backends backend = Enums::Backends::MpvBackend;
|
Enums::Backends backend = Enums::Backends::MpvBackend;
|
||||||
|
#endif
|
||||||
setenv("QT_QUICK_CONTROLS_STYLE", "Desktop", 1);
|
setenv("QT_QUICK_CONTROLS_STYLE", "Desktop", 1);
|
||||||
QApplication app(argc, argv);
|
QApplication app(argc, argv);
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
|
@ -99,23 +102,24 @@ main(int argc, char* argv[])
|
||||||
app.setApplicationName("KittehPlayer");
|
app.setApplicationName("KittehPlayer");
|
||||||
|
|
||||||
QSettings settings;
|
QSettings settings;
|
||||||
QString backendSetting = settings.value("Backend/backend", "mpv").toString();
|
QString backendSetting = settings.value("Backend/backend", "").toString();
|
||||||
if (backendSetting == "mpv") {
|
if (backendSetting.length() == 0) {
|
||||||
qDebug() << "Using MPV backend.";
|
#ifndef DISABLE_MpvPlayerBackend
|
||||||
backend = Enums::Backends::MpvBackend;
|
settings.setValue("Backend/backend", "mpv");
|
||||||
} else if (backendSetting == "direct-mpv") {
|
#else
|
||||||
qDebug() << "Using Direct MPV backend.";
|
settings.setValue("Backend/backend", "direct-mpv");
|
||||||
backend = Enums::Backends::DirectMpvBackend;
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qDebug() << backendSetting;
|
||||||
|
|
||||||
for (int i = 1; i < argc; ++i) {
|
for (int i = 1; i < argc; ++i) {
|
||||||
if (!qstrcmp(argv[i], "--update")) {
|
if (!qstrcmp(argv[i], "--update")) {
|
||||||
Utils::updateAppImage();
|
Utils::updateAppImage();
|
||||||
} else if (!qstrcmp(argv[i], "--backend=mpv")) {
|
} else if (!qstrcmp(argv[i], "--backend=mpv") || backendSetting == "mpv") {
|
||||||
qDebug() << "Using MPV backend.";
|
|
||||||
backend = Enums::Backends::MpvBackend;
|
backend = Enums::Backends::MpvBackend;
|
||||||
} else if (!qstrcmp(argv[i], "--backend=direct-mpv")) {
|
} else if (!qstrcmp(argv[i], "--backend=direct-mpv") ||
|
||||||
qDebug() << "Using Direct MPV backend.";
|
backendSetting == "direct-mpv") {
|
||||||
backend = Enums::Backends::DirectMpvBackend;
|
backend = Enums::Backends::DirectMpvBackend;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -128,23 +132,25 @@ main(int argc, char* argv[])
|
||||||
setenv("PATH", newpath.toUtf8().constData(), 1);
|
setenv("PATH", newpath.toUtf8().constData(), 1);
|
||||||
|
|
||||||
qmlRegisterUncreatableMetaObject(
|
qmlRegisterUncreatableMetaObject(
|
||||||
Enums::staticMetaObject, // static meta object
|
Enums::staticMetaObject, "player", 1, 0, "Enums", "Error: only enums");
|
||||||
"player", // import statement (can be any string)
|
|
||||||
1,
|
|
||||||
0, // major and minor version of the import
|
|
||||||
"Enums", // name in QML (does not have to match C++ name)
|
|
||||||
"Error: only enums" // error in case someone tries to create a MyNamespace
|
|
||||||
// object
|
|
||||||
);
|
|
||||||
qRegisterMetaType<Enums::PlayStatus>("Enums.PlayStatus");
|
qRegisterMetaType<Enums::PlayStatus>("Enums.PlayStatus");
|
||||||
qRegisterMetaType<Enums::VolumeStatus>("Enums.VolumeStatus");
|
qRegisterMetaType<Enums::VolumeStatus>("Enums.VolumeStatus");
|
||||||
qRegisterMetaType<Enums::Backends>("Enums.Backends");
|
qRegisterMetaType<Enums::Backends>("Enums.Backends");
|
||||||
|
|
||||||
qRegisterMetaType<Enums::Commands>("Enums.Commands");
|
qRegisterMetaType<Enums::Commands>("Enums.Commands");
|
||||||
|
|
||||||
|
qmlRegisterType<UtilsClass>("player", 1, 0, "Utils");
|
||||||
|
|
||||||
switch (backend) {
|
switch (backend) {
|
||||||
case Enums::Backends::MpvBackend: {
|
case Enums::Backends::MpvBackend: {
|
||||||
|
#ifndef DISABLE_MpvPlayerBackend
|
||||||
qmlRegisterType<MpvPlayerBackend>("player", 1, 0, "PlayerBackend");
|
qmlRegisterType<MpvPlayerBackend>("player", 1, 0, "PlayerBackend");
|
||||||
|
#else
|
||||||
|
qDebug() << "Normal MPV backend not available, resetting backend option "
|
||||||
|
"to blank.";
|
||||||
|
settings.setValue("Backend/backend", "direct-mpv");
|
||||||
|
app.exit();
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Enums::Backends::DirectMpvBackend: {
|
case Enums::Backends::DirectMpvBackend: {
|
||||||
|
|
|
@ -133,16 +133,21 @@ Item {
|
||||||
var x = Math.max(Screen.height / 256, fun.nyanCat ? 12 : 2)
|
var x = Math.max(Screen.height / 256, fun.nyanCat ? 12 : 2)
|
||||||
return isMouse & !fun.nyanCat ? x * 2 : x
|
return isMouse & !fun.nyanCat ? x * 2 : x
|
||||||
}
|
}
|
||||||
|
|
||||||
MouseArea {
|
MouseArea {
|
||||||
id: mouseAreaProgressBar
|
id: mouseAreaProgressBar
|
||||||
y: parent.height
|
|
||||||
width: parent.width
|
width: parent.width
|
||||||
height: parent.height
|
height: parent.height
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
y: parent.y
|
||||||
|
x: parent.x
|
||||||
hoverEnabled: true
|
hoverEnabled: true
|
||||||
propagateComposedEvents: true
|
propagateComposedEvents: false
|
||||||
acceptedButtons: Qt.NoButton
|
acceptedButtons: Qt.NoButton
|
||||||
|
z: 1
|
||||||
|
onPositionChanged: {
|
||||||
|
var a = (mouseAreaProgressBar.mouseX * (progressBar.to / (progressBackground.width)));
|
||||||
|
hoverProgressLabel.text = utils.createTimestamp(a)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
background: Rectangle {
|
background: Rectangle {
|
||||||
|
@ -153,6 +158,28 @@ Item {
|
||||||
height: progressBar.getProgressBarHeight(
|
height: progressBar.getProgressBarHeight(
|
||||||
fun.nyanCat, mouseAreaProgressBar.containsMouse)
|
fun.nyanCat, mouseAreaProgressBar.containsMouse)
|
||||||
color: appearance.progressBackgroundColor
|
color: appearance.progressBackgroundColor
|
||||||
|
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
x: (mouseAreaProgressBar.mouseX - width / 2) + progressBar.leftPadding
|
||||||
|
y: progressBackground.y - 20 - height
|
||||||
|
visible: mouseAreaProgressBar.containsMouse
|
||||||
|
color: appearance.mainBackground
|
||||||
|
height: 20
|
||||||
|
width: 50
|
||||||
|
z: 80
|
||||||
|
Text {
|
||||||
|
id: hoverProgressLabel
|
||||||
|
text: "0:00"
|
||||||
|
color: "white"
|
||||||
|
padding: 2
|
||||||
|
font.family: appearance.fontName
|
||||||
|
font.pixelSize: 14
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
renderType: Text.NativeRendering
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ProgressBar {
|
ProgressBar {
|
||||||
id: cachedLength
|
id: cachedLength
|
||||||
background: Item {
|
background: Item {
|
||||||
|
@ -178,7 +205,6 @@ Item {
|
||||||
player.chaptersChanged.connect(chaptersChanged)
|
player.chaptersChanged.connect(chaptersChanged)
|
||||||
}
|
}
|
||||||
function chaptersChanged(chapters) {
|
function chaptersChanged(chapters) {
|
||||||
console.log(JSON.stringify(chapters))
|
|
||||||
for (var i = 0, len = chapters.length; i < len; i++) {
|
for (var i = 0, len = chapters.length; i < len; i++) {
|
||||||
var chapter = chapters[i]
|
var chapter = chapters[i]
|
||||||
var component = Qt.createComponent(
|
var component = Qt.createComponent(
|
||||||
|
@ -197,7 +223,6 @@ Item {
|
||||||
z: 50
|
z: 50
|
||||||
anchors.left: progressBackground.left
|
anchors.left: progressBackground.left
|
||||||
width: progressBar.visualPosition * parent.width
|
width: progressBar.visualPosition * parent.width
|
||||||
+ (progressBar.handle.width / 2)
|
|
||||||
height: parent.height
|
height: parent.height
|
||||||
color: appearance.progressSliderColor
|
color: appearance.progressSliderColor
|
||||||
Image {
|
Image {
|
||||||
|
|
|
@ -16,6 +16,8 @@ Window {
|
||||||
width: 720
|
width: 720
|
||||||
height: 480
|
height: 480
|
||||||
|
|
||||||
|
property bool onTop: false
|
||||||
|
|
||||||
Translator {
|
Translator {
|
||||||
id: translate
|
id: translate
|
||||||
}
|
}
|
||||||
|
@ -117,30 +119,25 @@ Window {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Utils {
|
||||||
|
id: utils
|
||||||
|
}
|
||||||
|
|
||||||
PlayerBackend {
|
PlayerBackend {
|
||||||
id: player
|
id: player
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
width: parent.width
|
width: parent.width
|
||||||
height: parent.height
|
height: parent.height
|
||||||
z: 1
|
z: 1
|
||||||
property bool controlsShowing: true
|
|
||||||
|
|
||||||
function startPlayer() {
|
function startPlayer() {
|
||||||
console.log(player)
|
|
||||||
console.log(typeof (player))
|
|
||||||
var args = Qt.application.arguments
|
var args = Qt.application.arguments
|
||||||
var len = Qt.application.arguments.length
|
var len = Qt.application.arguments.length
|
||||||
var argNo = 0
|
var argNo = 0
|
||||||
|
|
||||||
if (!appearance.useMpvSubs) {
|
if (!appearance.useMpvSubs) {
|
||||||
player.setOption("sub-font", "Noto Sans")
|
|
||||||
player.setOption("sub-font-size", "24")
|
|
||||||
player.setOption("sub-ass-override", "force")
|
player.setOption("sub-ass-override", "force")
|
||||||
player.setOption("sub-ass", "off")
|
player.setOption("sub-ass", "off")
|
||||||
player.setOption("sub-border-size", "0")
|
player.setOption("sub-border-size", "0")
|
||||||
player.setOption("sub-bold", "off")
|
|
||||||
player.setOption("sub-scale-by-window", "on")
|
|
||||||
player.setOption("sub-scale-with-window", "on")
|
|
||||||
player.setOption("sub-color", "0.0/0.0/0.0/0.0")
|
player.setOption("sub-color", "0.0/0.0/0.0/0.0")
|
||||||
player.setOption("sub-border-color", "0.0/0.0/0.0/0.0")
|
player.setOption("sub-border-color", "0.0/0.0/0.0/0.0")
|
||||||
player.setOption("sub-back-color", "0.0/0.0/0.0/0.0")
|
player.setOption("sub-back-color", "0.0/0.0/0.0/0.0")
|
||||||
|
@ -198,6 +195,15 @@ Window {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: controlsOverlay
|
||||||
|
anchors.centerIn: player
|
||||||
|
height: player.height
|
||||||
|
width: player.width
|
||||||
|
property bool controlsShowing: true
|
||||||
|
z: 2
|
||||||
|
|
||||||
function hideControls(force) {
|
function hideControls(force) {
|
||||||
if (!menuBar.anythingOpen() || force) {
|
if (!menuBar.anythingOpen() || force) {
|
||||||
|
@ -212,12 +218,6 @@ Window {
|
||||||
mouseAreaPlayer.cursorShape = Qt.ArrowCursor
|
mouseAreaPlayer.cursorShape = Qt.ArrowCursor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
Item {
|
|
||||||
anchors.centerIn: player
|
|
||||||
height: player.height
|
|
||||||
width: player.width
|
|
||||||
z: 2
|
|
||||||
|
|
||||||
MouseArea {
|
MouseArea {
|
||||||
id: mouseAreaBar
|
id: mouseAreaBar
|
||||||
|
@ -278,18 +278,18 @@ Window {
|
||||||
running: true
|
running: true
|
||||||
repeat: false
|
repeat: false
|
||||||
onTriggered: {
|
onTriggered: {
|
||||||
player.hideControls()
|
controlsOverlay.hideControls()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
onPositionChanged: {
|
onPositionChanged: {
|
||||||
player.showControls()
|
controlsOverlay.showControls()
|
||||||
mouseAreaPlayerTimer.restart()
|
mouseAreaPlayerTimer.restart()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MainMenu {
|
MainMenu {
|
||||||
id: menuBar
|
id: menuBar
|
||||||
visible: player.controlsShowing
|
visible: controlsOverlay.controlsShowing
|
||||||
}
|
}
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
|
@ -298,7 +298,7 @@ Window {
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
anchors.left: menuBar.right
|
anchors.left: menuBar.right
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
visible: player.controlsShowing
|
visible: controlsOverlay.controlsShowing
|
||||||
|
|
||||||
color: appearance.mainBackground
|
color: appearance.mainBackground
|
||||||
|
|
||||||
|
@ -319,7 +319,7 @@ Window {
|
||||||
font.pixelSize: 14
|
font.pixelSize: 14
|
||||||
font.bold: true
|
font.bold: true
|
||||||
opacity: 1
|
opacity: 1
|
||||||
visible: player.controlsShowing
|
visible: controlsOverlay.controlsShowing
|
||||||
&& ((!appearance.titleOnlyOnFullscreen)
|
&& ((!appearance.titleOnlyOnFullscreen)
|
||||||
|| (mainWindow.visibility == Window.FullScreen))
|
|| (mainWindow.visibility == Window.FullScreen))
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
|
@ -332,7 +332,7 @@ Window {
|
||||||
|
|
||||||
ControlsBar {
|
ControlsBar {
|
||||||
id: controlsBar
|
id: controlsBar
|
||||||
visible: player.controlsShowing
|
visible: controlsOverlay.controlsShowing
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,12 @@
|
||||||
#ifndef UTILS_H
|
#ifndef UTILS_H
|
||||||
#define UTILS_H
|
#define UTILS_H
|
||||||
|
#include <QObject>
|
||||||
#include <QWindow>
|
#include <QWindow>
|
||||||
|
#include <QtGlobal>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
namespace Utils {
|
namespace Utils {
|
||||||
|
Q_NAMESPACE
|
||||||
void
|
void
|
||||||
SetDPMS(bool on);
|
SetDPMS(bool on);
|
||||||
void
|
void
|
||||||
|
@ -15,4 +18,19 @@ createTimestamp(int seconds);
|
||||||
void
|
void
|
||||||
ResetScreensaver();
|
ResetScreensaver();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class UtilsClass : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public slots:
|
||||||
|
void SetDPMS(bool on) { Utils::SetDPMS(on); };
|
||||||
|
void AlwaysOnTop(WId wid, bool on) { Utils::AlwaysOnTop(wid, on); };
|
||||||
|
void updateAppImage() { Utils::updateAppImage(); };
|
||||||
|
QString createTimestamp(int seconds)
|
||||||
|
{
|
||||||
|
return Utils::createTimestamp(seconds);
|
||||||
|
};
|
||||||
|
void ResetScreensaver() { Utils::ResetScreensaver(); };
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue