1
0
Fork 0

[Backend+UI] Added hover to show time and made backend handling better.

This commit is contained in:
NamedKitten 2018-11-26 16:50:25 +00:00
parent 975a548ef6
commit 1aa3e6f66b
7 changed files with 113 additions and 50 deletions

View file

@ -1,4 +1,4 @@
#ifndef DirectMpvPlayerBackend_Hc #ifndef DirectMpvPlayerBackend_H
#define DirectMpvPlayerBackend_H #define DirectMpvPlayerBackend_H
#include <mpv/client.h> #include <mpv/client.h>

View file

@ -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

View file

@ -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

View file

@ -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: {

View file

@ -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 {

View file

@ -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
} }
} }
} }

View file

@ -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