From f3b3fc85acf51930478247dbdb6a09f2bd799131 Mon Sep 17 00:00:00 2001 From: Kitteh Date: Sat, 27 Oct 2018 16:11:29 +0100 Subject: [PATCH] [Dev] Added QML reloading. --- .gitignore | 3 +- CMakeLists.txt | 37 ++++ runtimeqml/.gitignore | 75 +++++++ runtimeqml/LICENSE | 24 +++ runtimeqml/README.md | 87 ++++++++ runtimeqml/runtimeqml.cpp | 398 ++++++++++++++++++++++++++++++++++++ runtimeqml/runtimeqml.h | 82 ++++++++ runtimeqml/runtimeqml.pri | 13 ++ runtimeqml/runtimeqml.qbs | 18 ++ src/main.cpp | 15 +- src/mpvobject.cpp | 2 +- src/qml/CustomMenuItem.qmlc | Bin 0 -> 3956 bytes src/qml/codes.jsc | Bin 0 -> 59408 bytes src/qml/main.qml | 19 +- src/qml/main.qmlc | Bin 0 -> 96648 bytes 15 files changed, 757 insertions(+), 16 deletions(-) create mode 100644 CMakeLists.txt create mode 100644 runtimeqml/.gitignore create mode 100644 runtimeqml/LICENSE create mode 100644 runtimeqml/README.md create mode 100644 runtimeqml/runtimeqml.cpp create mode 100644 runtimeqml/runtimeqml.h create mode 100644 runtimeqml/runtimeqml.pri create mode 100644 runtimeqml/runtimeqml.qbs create mode 100644 src/qml/CustomMenuItem.qmlc create mode 100644 src/qml/codes.jsc create mode 100644 src/qml/main.qmlc diff --git a/.gitignore b/.gitignore index d4adf5b..b2dd87d 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,5 @@ appdir AppDir Makefile linuxdeploy* -other_libs \ No newline at end of file +other_libs +sffmpeg \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..e152cfb --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,37 @@ +cmake_minimum_required(VERSION 3.1.0) + +project(KittehPlayer) +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_AUTOMOC ON) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -fstrict-aliasing -Wno-deprecated-declarations -Wno-unused-variable") + +option(DEVELOP "Enable runtime QML reloading for developing." OFF) + + +find_package(Qt5Core REQUIRED) +find_package(Qt5 REQUIRED Qml Quick Gui Widgets Core) + +find_package(Qt5QuickCompiler) +qtquick_compiler_add_resources(qml_QRC src/qml/qml.qrc) + +set(SOURCES + src/main.cpp + src/mpvobject.cpp +) + +if(DEVELOP) +set(SOURCES ${SOURCES} runtimeqml/runtimeqml.cpp) +add_definitions(-DQRC_SOURCE_PATH="${PROJECT_SOURCE_DIR}/src/qml") +endif(DEVELOP) + +add_executable(KittehPlayer ${SOURCES} ${qml_QRC}) + +# Use the Qml/Quick modules from Qt 5. +target_link_libraries(KittehPlayer mpv) + +qt5_use_modules(KittehPlayer Qml Quick Core Gui Widgets) + + + + diff --git a/runtimeqml/.gitignore b/runtimeqml/.gitignore new file mode 100644 index 0000000..dcd1292 --- /dev/null +++ b/runtimeqml/.gitignore @@ -0,0 +1,75 @@ +# This file is used to ignore files which are generated +# ---------------------------------------------------------------------------- + +*~ +*.autosave +*.a +*.core +*.moc +*.o +*.obj +*.orig +*.rej +*.so +*.so.* +*_pch.h.cpp +*_resource.rc +*.qm +.#* +*.*# +core +!core/ +tags +.DS_Store +.directory +*.debug +Makefile* +*.prl +*.app +moc_*.cpp +ui_*.h +qrc_*.cpp +Thumbs.db +*.res +*.rc +/.qmake.cache +/.qmake.stash + +# qtcreator generated files +*.pro.user* +# qtcreator builds of test project +build-RuntimeQML-* + +# xemacs temporary files +*.flc + +# Vim temporary files +.*.swp + +# Visual Studio generated files +*.ib_pdb_index +*.idb +*.ilk +*.pdb +*.sln +*.suo +*.vcproj +*vcproj.*.*.user +*.ncb +*.sdf +*.opensdf +*.vcxproj +*vcxproj.* + +# MinGW generated files +*.Debug +*.Release + +# Python byte code +*.pyc + +# Binaries +# -------- +*.dll +*.exe + diff --git a/runtimeqml/LICENSE b/runtimeqml/LICENSE new file mode 100644 index 0000000..f67c3ad --- /dev/null +++ b/runtimeqml/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2018, Benjamin Balga +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/runtimeqml/README.md b/runtimeqml/README.md new file mode 100644 index 0000000..01ca199 --- /dev/null +++ b/runtimeqml/README.md @@ -0,0 +1,87 @@ +# Runtime QML for Qt + +**Written by**: *Benjamin Balga.* +**Copyright**: ***2018***, *Benjamin Balga*, released under BSD license. + + +## About + +This is a base project to get runtime QML reload in your Qt project. +It allows you to reload all QML code at runtime, without recompiling or restarting your app, saving time. + +With auto-reload, QML files are watched (based on the QRC file) and reloaded when you save them, or can trigger it manually. + +On reload, all windows are closed, and the main window is reloaded. All "QML-only data" is lost, so use links to C++ models/properties as needed. + +It only works with Window component as top object, or QQuickWindow subclasses. + +### Examples +Example project is located here: https://github.com/GIPdA/runtimeqml_examples + + +## How to use it in your project + +Clone the repo into your project (or copy-paste the ```runtimeqml``` folder) and import the ```.pri``` project file into your ```.pro``` file: + + include(runtimeqml/runtimeqml.pri) + + +### With Qbs +The Qbs project file includes RuntimeQML as a static library. Check the example project to see how to include it in your project. + + +## Usage + +Include ```runtimeqml.h``` header file, and create the RuntimeQML object (after the QML engine) : + + RuntimeQML *rt = new RuntimeQML(&engine, QRC_SOURCE_PATH"/qml.qrc"); + +The second argument is the path to your qrc file listing all your QML files, needed for the auto-reload feature only. You can omit it if you don't want auto-reload. +```QRC_SOURCE_PATH``` is defined in the ```.pri/.qbs``` file to its parent path, just to not have to manually set an absolute path... + + +Set the "options" you want, or not: + + rt->noDebug(); // Removes debug prints + rt->setAutoReload(true); // Enable auto-reload (begin to watch files) + //rt->setCloseAllOnReload(false); // Don't close all windows on reload. Not advised! + rt->setMainQmlFilename("main.qml"); // This is the file that loaded on reload, default is "main.qml" + +For the auto-reload feature: + + rt->addSuffix("conf"); // Adds a file suffix to the "white list" for watched files. "qml" is already in. + rt->ignorePrefix("/test"); // Ignore a prefix in the QRC file. + rt->ignoreFile("/Page2.qml"); // Ignore a file name with prefix (supports classic wildcard matching) + + +Then load the main QML file : + + rt->reload(); + +And you're all set! + + +You can also check the test project. Beware, includes and defines differs a bit... + + +## Manual reload + +Add the RuntimeQML object to the QML context: + + engine.rootContext()->setContextProperty("RuntimeQML", rt); + +Trigger the reload when and where you want, like with a button: + + Button { + text: "Reload" + onClicked: { + RuntimeQML.reload(); + } + } + +You can do it in C++ too, of course. + + + +## License +See LICENSE file. diff --git a/runtimeqml/runtimeqml.cpp b/runtimeqml/runtimeqml.cpp new file mode 100644 index 0000000..8eb63c9 --- /dev/null +++ b/runtimeqml/runtimeqml.cpp @@ -0,0 +1,398 @@ +#include "runtimeqml.h" + +#include +#include +#include +#include + +/*! + * \brief Construct a RuntimeQML object with a path to the qrc file. + * \param engine App engine to reload. + * \param qrcFilename File name of the QRC file for auto reload. + * \param parent Pointer to a parent object. + */ +RuntimeQML::RuntimeQML(QQmlApplicationEngine* engine, const QString &qrcFilename, QObject *parent) : + QObject(parent), + m_engine(engine), + m_qrcFilename(qrcFilename), + m_mainQmlFilename("main.qml") +{ + m_allowedSuffixList << "qml"; +} + + +/*! + * \brief Returns the absolute path for the given qml file. + * \param qmlFile Qml filename + */ +QString RuntimeQML::adjustPath(QString qmlFile) +{ + return m_selector.select(qrcAbsolutePath() + "/" + qmlFile); +} + +/*! + * \brief Returns the absolute path to the QRC file. + */ +QString RuntimeQML::qrcAbsolutePath() const +{ + return QFileInfo(m_qrcFilename).absolutePath(); +} + +/*! + * \brief Filename of the QRC file. + */ +QString RuntimeQML::qrcFilename() const +{ + return m_qrcFilename; +} + +/*! + * \brief If true, files are watched for changes and auto-reloaded. + * Otherwise, you need to trigger a reload manually from your code by calling reload(). + * \sa reload + */ +bool RuntimeQML::autoReload() const +{ + return m_autoReload; +} + +/*! + * \brief If true, all open windows will be closed upon reload. + * \default true + */ +bool RuntimeQML::closeAllOnReload() const +{ + return m_closeAllOnReload; +} + +/*! + * \brief QRC prefixes that are ignored. + */ +const QList& RuntimeQML::prefixIgnoreList() const +{ + return m_prefixIgnoreList; +} + +/*! + * \brief Files that are ignored. + */ +const QList &RuntimeQML::fileIgnoreList() const +{ + return m_fileIgnoreList; +} + +/*! + * \brief Allowed suffixes to filter files to watch for changes. + * By default contains only "qml". + */ +const QList &RuntimeQML::allowedSuffixes() const +{ + return m_allowedSuffixList; +} + +/*! + * \brief Call it if you don't want debug outputs from this class. + */ +void RuntimeQML::noDebug() +{ + if (m_noDebug) + return; + m_noDebug = true; +} + + +/*! + * \brief Reload the window. + */ +void RuntimeQML::reload() +{ + QMetaObject::invokeMethod(this, "reloadQml", Qt::QueuedConnection); +} + + +/*! + * \brief Call it from QML to set the current QQuickWindow. + * You shouldn't need to call it as it is done automatically on reload. + * \param window + */ +void RuntimeQML::setWindow(QQuickWindow* window) +{ + if (window == m_window) + return; + m_window = window; +} + + +/*! + * \brief Set the QRC filename for files to watch for changes. + * \param qrcFilename Path to a .qrc file. + */ +void RuntimeQML::setQrcFilename(QString qrcFilename) +{ + if (m_qrcFilename == qrcFilename) + return; + + m_qrcFilename = qrcFilename; + emit qrcFilenameChanged(qrcFilename); + + loadQrcFiles(); +} + +/*! + * \brief Set the name of the main qml file. + * Default is "main.qml". + * \param filename The main qml filename. + */ +void RuntimeQML::setMainQmlFilename(QString filename) +{ + if (m_mainQmlFilename == filename) + return; + + m_mainQmlFilename = filename; +} + + +/*! + * \brief If true, files are watched for changes and auto-reloaded. + * Otherwise, you need to trigger a reload manually from your code by calling reload(). + * \param reload True to auto-reload, false otherwise. + */ +void RuntimeQML::setAutoReload(bool autoReload) +{ + if (m_autoReload == autoReload) + return; + + m_autoReload = autoReload; + emit autoReloadChanged(autoReload); + + if (autoReload) + loadQrcFiles(); + else + unloadFileWatcher(); +} + +/*! + * \brief If true, all open windows are closed upon reload. Otherwise, might cause "link" errors with QML components. + * \param closeAllOnReload True to close all windows on reload, false otherwise. + */ +void RuntimeQML::setCloseAllOnReload(bool closeAllOnReload) +{ + if (m_closeAllOnReload == closeAllOnReload) + return; + + m_closeAllOnReload = closeAllOnReload; + emit closeAllOnReloadChanged(m_closeAllOnReload); +} + +/*! + * \brief Add a QRC prefix to ignore. + * \note Relevant for auto-reload only. + * \param prefix Prefix to ignore. + */ +void RuntimeQML::ignoreQrcPrefix(const QString& prefix) +{ + if (m_prefixIgnoreList.contains(prefix)) + return; + + m_prefixIgnoreList.append(prefix); + + if (m_autoReload) + loadQrcFiles(); +} + +/*! + * \brief Add a filename to ignore from changes. + * Applies to the full filename in the QRC entry (i.e. the local "path"), with the prefix. + * Supports "file globbing" matching using wildcards. + * \note Relevant for auto-reload only. + * \param filename Filename to ignore. + */ +void RuntimeQML::ignoreFile(const QString &filename) +{ + if (m_fileIgnoreList.contains(filename)) + return; + + m_fileIgnoreList.append(filename); + + if (m_autoReload) + loadQrcFiles(); +} + +/*! + * \brief Allow a file suffix to be watched for changes. + * \note Relevant for auto-reload only. + * \param suffix + */ +void RuntimeQML::addSuffix(const QString &suffix) +{ + if (m_allowedSuffixList.contains(suffix)) + return; + + m_allowedSuffixList.append(suffix); + + if (m_autoReload) + loadQrcFiles(); +} + + +/*! + * \brief Reload the QML. Do not call it directly, use reload() instead. + */ +void RuntimeQML::reloadQml() +{ + if (m_mainQmlFilename.isEmpty()) { + qWarning("No QML file specified."); + return; + } + + if (m_window) { + if (m_closeAllOnReload) { + // Find all child windows and close them + auto const allWindows = m_window->findChildren(); + for (int i {0}; i < allWindows.size(); ++i) { + QQuickWindow* w = qobject_cast(allWindows.at(i)); + if (w) { + w->close(); + w->deleteLater(); + } + } + } + + m_window->close(); + m_window->deleteLater(); + } + + m_engine->clearComponentCache(); + // TODO: test with network files + // TODO: QString path to QUrl doesn't work under Windows with load() (load fail) + m_engine->load(m_selector.select(qrcAbsolutePath() + "/" + m_mainQmlFilename)); + // NOTE: QQmlApplicationEngine::rootObjects() isn't cleared, should it be? + + if (!m_engine->rootObjects().isEmpty()) { + QQuickWindow* w = qobject_cast(m_engine->rootObjects().last()); + if (w) m_window = w; + } + +// for (auto *o : m_engine->rootObjects()) { +// qDebug() << "> " << o; +// } +} + +/*! + * \brief Called when a watched file changed, from QFileSystemWatcher. + * \param path Path/file that triggered the signal. + */ +void RuntimeQML::fileChanged(const QString& path) +{ + if (!m_noDebug) + qDebug() << "Reloading qml:" << path; + reload(); + +#if defined(Q_OS_WIN) + // Deleted files are removed from the watcher, re-add the file for + // systems that delete files to update them + if (m_fileWatcher) + QTimer::singleShot(500, m_fileWatcher, [this,path](){ + m_fileWatcher->addPath(path); + }); +#endif +} + + +/*! + * \brief Load qml from the QRC file to watch them. + */ +void RuntimeQML::loadQrcFiles() +{ + unloadFileWatcher(); + + m_fileWatcher = new QFileSystemWatcher(this); + connect(m_fileWatcher, &QFileSystemWatcher::fileChanged, this, &RuntimeQML::fileChanged); + + QFile file(m_qrcFilename); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + qWarning("Unable to open resource file '%s', RuntimeQML will not work! Error: %s", + qPrintable(m_qrcFilename), qPrintable(file.errorString())); + return; + } + + QString const basePath = qrcAbsolutePath() + "/"; + QString currentPrefix; + + // Read each entry + QXmlStreamReader inputStream(&file); + while (!inputStream.atEnd() && !inputStream.hasError()) { + inputStream.readNext(); + if (inputStream.isStartElement()) { + QString name { inputStream.name().toString() }; + + // Check prefix + if (name == "qresource") { + if (inputStream.attributes().hasAttribute("prefix")) { + auto p = inputStream.attributes().value("prefix").toString(); + if (m_prefixIgnoreList.contains(p)) { + // Ignore this prefix, loop through elements in this 'qresource' tag + while (!inputStream.atEnd() && !inputStream.hasError()) { + inputStream.readNext(); + if (inputStream.isEndElement() && inputStream.name() == "qresource") + break; + } + continue; + } + currentPrefix = p; + } + } + + // Check file name + if (name == "file") { + QString const filename { inputStream.readElementText() }; + + // Check ignore list + QString const fullFilename { currentPrefix + filename }; + auto it = std::find_if(m_fileIgnoreList.cbegin(), m_fileIgnoreList.cend(), [&](QString const& pattern) { + QRegExp re(pattern); + re.setPatternSyntax(QRegExp::WildcardUnix); + return re.exactMatch(fullFilename); + }); + + if (it != m_fileIgnoreList.cend()) + continue; + + QFileInfo const file { filename }; + + // Add to the watch list if the file suffix is allowed + if (m_allowedSuffixList.contains(file.suffix())) { + QString fp { m_selector.select(basePath + filename) }; + m_fileWatcher->addPath(fp); + //qDebug() << " " << file.absoluteFilePath() << fp; + } + } + } + } + + if (!m_noDebug) { + qDebug("Watching QML files:"); + int const fileCount = m_fileWatcher->files().size(); + + for (auto &f : m_fileWatcher->files()) { + qDebug() << " " << f; + } + + if (fileCount > 0) + qDebug(" Total: %d", fileCount); + else + qDebug(" None."); + } +} + +/*! + * \brief Unload the file watcher. + */ +void RuntimeQML::unloadFileWatcher() +{ + if (m_fileWatcher) { + disconnect(m_fileWatcher); + delete m_fileWatcher; + m_fileWatcher = nullptr; + } +} diff --git a/runtimeqml/runtimeqml.h b/runtimeqml/runtimeqml.h new file mode 100644 index 0000000..b58359b --- /dev/null +++ b/runtimeqml/runtimeqml.h @@ -0,0 +1,82 @@ +#ifndef RUNTIMEQML_H +#define RUNTIMEQML_H + +#include +#include +#include +#include +#include + +#include + + +class RuntimeQML : public QObject +{ + Q_OBJECT + Q_PROPERTY(QString qrcFilename READ qrcFilename WRITE setQrcFilename NOTIFY qrcFilenameChanged) + Q_PROPERTY(bool autoReload READ autoReload WRITE setAutoReload NOTIFY autoReloadChanged) + Q_PROPERTY(bool closeAllOnReload READ closeAllOnReload WRITE setCloseAllOnReload NOTIFY closeAllOnReloadChanged) + +public: + explicit RuntimeQML(QQmlApplicationEngine *engine, QString const& qrcFilename = QString(), QObject *parent = 0); + + // If using QQmlFileSelector with Loader + Q_INVOKABLE QString adjustPath(QString qmlFile); + Q_INVOKABLE QString qrcAbsolutePath() const; + + QString qrcFilename() const; + + bool autoReload() const; + bool closeAllOnReload() const; + + QList const & prefixIgnoreList() const; + QList const & fileIgnoreList() const; + QList const & allowedSuffixes() const; + + void noDebug(); + +signals: + void autoReloadChanged(bool autoReload); + void qrcFilenameChanged(QString qrcFilename); + void closeAllOnReloadChanged(bool closeAllOnReload); + +public slots: + void reload(); + void setWindow(QQuickWindow* window); + + void setQrcFilename(QString qrcFilename); + void setMainQmlFilename(QString filename); + + void setAutoReload(bool autoReload); + void setCloseAllOnReload(bool closeAllOnReload); + + void ignoreQrcPrefix(QString const& prefix); + void ignoreFile(QString const& filename); + + void addSuffix(QString const& suffix); + +private slots: + void reloadQml(); + void fileChanged(const QString &path); + +private: + void loadQrcFiles(); + void unloadFileWatcher(); + + QQmlApplicationEngine *m_engine {nullptr}; + QQuickWindow *m_window {nullptr}; + QFileSelector m_selector; + + QString m_qrcFilename; + QString m_mainQmlFilename; + + bool m_autoReload {false}; + QFileSystemWatcher* m_fileWatcher {nullptr}; + QList m_prefixIgnoreList; + QList m_fileIgnoreList; + QList m_allowedSuffixList; + bool m_noDebug {false}; + bool m_closeAllOnReload {true}; +}; + +#endif // RUNTIMEQML_H diff --git a/runtimeqml/runtimeqml.pri b/runtimeqml/runtimeqml.pri new file mode 100644 index 0000000..41040dd --- /dev/null +++ b/runtimeqml/runtimeqml.pri @@ -0,0 +1,13 @@ +# Qt Quick Runtime Reloader + +QT += core qml quick + +INCLUDEPATH += $$PWD + +DEFINES += "QRC_SOURCE_PATH=\\\"$$PWD/..\\\"" + +SOURCES += \ + $$PWD/runtimeqml.cpp + +HEADERS += \ + $$PWD/runtimeqml.h diff --git a/runtimeqml/runtimeqml.qbs b/runtimeqml/runtimeqml.qbs new file mode 100644 index 0000000..c5beb52 --- /dev/null +++ b/runtimeqml/runtimeqml.qbs @@ -0,0 +1,18 @@ +import qbs 1.0 + +StaticLibrary { + name: "runtimeqml" + files: [ + "runtimeqml.cpp", + "runtimeqml.h", + ] + Depends { name: 'cpp' } + Depends { name: "Qt.core" } + Depends { name: "Qt.quick" } + + Export { + Depends { name: "cpp" } + cpp.includePaths: [product.sourceDirectory] + cpp.defines: ['QRC_SOURCE_PATH="'+path+'/.."'] + } +} diff --git a/src/main.cpp b/src/main.cpp index 45b9d80..2d6aae4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,7 +6,9 @@ #include "config.h" #include "mpvobject.h" - +#ifdef QRC_SOURCE_PATH +#include "runtimeqml/runtimeqml.h" +#endif #include @@ -59,6 +61,15 @@ view->setSource(QUrl("qrc:///player/main.qml")); view->show();*/ QQmlApplicationEngine engine; - engine.load(QUrl(QStringLiteral("qrc:///player/main.qml"))); +#ifdef QRC_SOURCE_PATH +RuntimeQML *rt = new RuntimeQML(&engine, QRC_SOURCE_PATH"/qml.qrc"); + +rt->setAutoReload(true); +rt->setMainQmlFilename("main.qml"); +rt->reload(); +#else +engine.load(QUrl(QStringLiteral("qrc:///player/main.qml"))); +#endif + return app.exec(); } diff --git a/src/mpvobject.cpp b/src/mpvobject.cpp index 39c2eb7..fbcdf39 100644 --- a/src/mpvobject.cpp +++ b/src/mpvobject.cpp @@ -118,7 +118,7 @@ MpvObject::MpvObject(QQuickItem * parent) throw std::runtime_error("could not create mpv context"); mpv_set_option_string(mpv, "terminal", "yes"); - mpv_set_option_string(mpv, "msg-level", "all=v"); + //mpv_set_option_string(mpv, "msg-level", "all=v"); // Fix? mpv_set_option_string(mpv, "ytdl", "yes"); diff --git a/src/qml/CustomMenuItem.qmlc b/src/qml/CustomMenuItem.qmlc new file mode 100644 index 0000000000000000000000000000000000000000..5b144495d38e3bafef81fddf4fd79773c6599e2b GIT binary patch literal 3956 zcmb7`O>9(E6vq#x9kiu5r3I=Cr9kns_Pbz_#2UnpFqn!&F(HxZycyciFQ!uvg0V5K zT)F7Rge6NBny_KV!i5WrEQ}kwAf_fRyXewHfB$>motf4$Oi%lt`|dsGo^$TG=bZPh zUK`3rnPTR7GplQAu&>*D?&i0d6`wQf8yf7-4ILYZ^7-N8Ca}y2O_pQIys*G>!15SUK}{leeajge?Q;x<+s1Kf4_F~&%)rDhOhoOv;(Og zu>6b}|Mmcg9=qSo$A6*M;R_AmLcJd!F^V383;6ppc%#nj2hhIVY!UnoF2dgn+JR`y z4{l_O8)ZZO95maewF|LKYHDbdk0RMk#?ZW) z-4>gx$!?1jLBa0P)QcsHvbPKDmH<@E-fmm9TFx1C1$!+eYg>!!o*LtdoTFe*aeaxn zzFc8fchd}B@S;`Exz`@+n441NeJVd>vu#)Em0&8^NyWRX#dDuMsL9U0vYl5q+Ucml z4mn(t9pu7!UJG_YeuNlTJ5Q@!swp2^u_K4veQismx`VNJJvd8AT9aE#I(f}S8g&nK zRElINS4ZJ_d%Pa*O6$^7AFqd63;G*aUqN^oMmk}3n})NK!sgNKlbmXuVO`!lX)gVW zllHBG9q8Z5$|0T?nFYU?+J4seTT(8nk2t>e1xmtCTBqYHf4x?XL!FyB&L>4)(9(Um6vEAN){{dZ%sNzZZV!3#vzD zNBKl%d*G{IiKD(yz6Wo=4SrjEkG>x#N*+pjH+=P15wB1vQMwP!THveS>sj? zEBw~d8_@~yv$c3`yuYBO%{?T@oHEIl>Rl_HrRA;JQyql+d&G07gAm`6S{@E^KI+5S z+bq5v@H?v1$pQGl?O$IflcTbef}gTQ$6q30Z-aYa8Pt=o-5?Dja0@JfJK!N$0rfPP zE-(bngC%eW{03IQ8tB6CNstD&z+JEgQWSOsir^0T2`qy(&_;1|gEY7ZrocB~3ETw_ z!3tOdfpkwFSrIJQq-E_&%t-!ky~j@3tj!=>V4SjfC#n2fzrV-cK~n~aS-Tud`8?ey zmqzLaQVZzx+Why$M!8SXH)9c!*IlnUYdPi%_5u5HHtqZ%toAMv@-NMpK|Y74s{0w{ zMG*Mfpng5i+5$3JB=sGVXRiJ8)@vWedp<_f3@bgX7m<*@=}qhte!QHvInJ#(P9iP8 zBgP4M3i(F<`{FPw ztL^shL`5&yQ=h1=uTt9Y5Al*eif0}#r}1NoTh%u}b$yl6deiWZ=QNo(b~l)d^nT33 zQ8pELR)49kw^G{ozX`W@(rz;9ewCYVyL-CK+~1~;y4m5U>aR_k`t~(EEnrXi@Fbg^ zPqkNz79XdaJCpLhmN->P`)?OTPVrH771vdl-XLb@;ACC=l!a5yj_PjQ-P#q_)EO4o z9l39z2~Mu;Rz>(M&%yDe`#yrUK8HM`Ct4pC3TRZ-DIb*I^2d|%L2I&fooCIjqd(M{ z*E@{NFghbfPhL(Q>3se?9X=eo=h-1Q!yK3hq|Kd^%4Pfr(V0tzA462M0cKj(sLG>$}ZRw IOF8rQAJU4wi~s-t literal 0 HcmV?d00001 diff --git a/src/qml/codes.jsc b/src/qml/codes.jsc new file mode 100644 index 0000000000000000000000000000000000000000..d1b78e994696bbc0ee030ff081041b9bc61b261e GIT binary patch literal 59408 zcmbrn2Ur}{;<$|+vr$=V?AVDKB_=Ad64QujXcEOv`lgdAiMxtp!;T$0cI?=(W58a?}Ult=8s!HCnsn5*h)DE zww-m;X1^lY8&nXJWtJ z6UL3-X(F4ZKTXS@a>Di(ow?IJPd_s4*W*_km`Trst03pDoRgDZ%CYdK&Wz@Nge}BZ z07E}#v5oj~+w8D*4eFW~()@l09%tj5VmUdD_`}cykHDkw7(5P7z?1M4c>Jf~8F&_+ zgXiG|coD3}OYkzh0A6tPATw4_F^IfDK_I*cdi}O(7pPgUw+J*b=sa ztzjD|fS#}|YzNyzFW3QgghJ>IJ3$}l3p>LuuqzZnKiCa+hdp3V*bDZCV(1V1zyKHs zgJ3WWff5)B`@%374kKVBjDk|w5B7)AFb2lL0dOFc!9j2^90G^JVQ@Gc0p&0b#=``d z2$NtkOo0SUg=sJyX249C1+$?7=D=K-2lHV8ECfFtgjaDxT@Ba3wQwEO!}V|j+z2

o)N-&qtN<&*O0Y7l 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 zÐ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 OUnMS*b$A0#w6@>%mKkXP literal 0 HcmV?d00001