2020-03-24 09:52:50 +01:00
|
|
|
#include "mainui.hpp"
|
|
|
|
|
|
|
|
#include <cassert>
|
|
|
|
|
|
|
|
#include "medialibrary/medialib.hpp"
|
|
|
|
#include "medialibrary/mlqmltypes.hpp"
|
|
|
|
#include "medialibrary/mlalbummodel.hpp"
|
|
|
|
#include "medialibrary/mlartistmodel.hpp"
|
|
|
|
#include "medialibrary/mlalbumtrackmodel.hpp"
|
|
|
|
#include "medialibrary/mlgenremodel.hpp"
|
2020-09-17 21:06:35 +02:00
|
|
|
#include "medialibrary/mlurlmodel.hpp"
|
2020-03-24 09:52:50 +01:00
|
|
|
#include "medialibrary/mlvideomodel.hpp"
|
2020-10-14 16:30:48 +02:00
|
|
|
#include "medialibrary/mlrecentsmodel.hpp"
|
2020-03-24 09:52:50 +01:00
|
|
|
#include "medialibrary/mlrecentsvideomodel.hpp"
|
|
|
|
#include "medialibrary/mlfoldersmodel.hpp"
|
2021-03-18 10:01:01 +01:00
|
|
|
#include "medialibrary/mlgrouplistmodel.hpp"
|
2021-02-19 11:25:32 +01:00
|
|
|
#include "medialibrary/mlplaylistlistmodel.hpp"
|
|
|
|
#include "medialibrary/mlplaylistmodel.hpp"
|
|
|
|
#include "medialibrary/mlplaylist.hpp"
|
2020-03-24 09:52:50 +01:00
|
|
|
|
|
|
|
#include "player/player_controller.hpp"
|
2021-04-02 01:15:47 +02:00
|
|
|
#include "player/player_controlbar_model.hpp"
|
|
|
|
#include "player/control_list_model.hpp"
|
|
|
|
|
|
|
|
#include "dialogs/toolbar/controlbar_profile_model.hpp"
|
|
|
|
#include "dialogs/toolbar/controlbar_profile.hpp"
|
2020-03-24 09:52:50 +01:00
|
|
|
|
|
|
|
#include "playlist/playlist_model.hpp"
|
|
|
|
#include "playlist/playlist_controller.hpp"
|
|
|
|
|
2021-11-24 21:06:26 +01:00
|
|
|
#include "util/item_key_event_filter.hpp"
|
2021-01-05 17:50:15 +01:00
|
|
|
#include "util/imageluminanceextractor.hpp"
|
2020-03-24 09:52:50 +01:00
|
|
|
#include "util/i18n.hpp"
|
2021-07-07 12:15:41 +02:00
|
|
|
#include "util/keyhelper.hpp"
|
2020-03-24 09:52:50 +01:00
|
|
|
#include "util/systempalette.hpp"
|
2020-09-29 20:34:53 +02:00
|
|
|
#include "util/sortfilterproxymodel.hpp"
|
2020-03-24 09:52:50 +01:00
|
|
|
#include "util/navigation_history.hpp"
|
2021-03-11 10:16:46 +01:00
|
|
|
#include "util/qmlinputitem.hpp"
|
2021-10-19 23:47:51 +02:00
|
|
|
#include "util/mouse_event_filter.hpp"
|
2020-03-24 09:52:50 +01:00
|
|
|
|
|
|
|
#include "dialogs/help/aboutmodel.hpp"
|
|
|
|
#include "dialogs/dialogs_provider.hpp"
|
|
|
|
#include "dialogs/dialogs/dialogmodel.hpp"
|
|
|
|
|
|
|
|
#include "network/networkmediamodel.hpp"
|
|
|
|
#include "network/networkdevicemodel.hpp"
|
2020-09-08 13:59:58 +02:00
|
|
|
#include "network/networksourcesmodel.hpp"
|
2020-09-11 13:26:03 +02:00
|
|
|
#include "network/servicesdiscoverymodel.hpp"
|
2020-03-24 09:52:50 +01:00
|
|
|
|
2020-09-14 10:22:55 +02:00
|
|
|
#include "menus/qml_menu_wrapper.hpp"
|
|
|
|
|
2021-04-14 14:58:22 +02:00
|
|
|
#include "widgets/native/roundimage.hpp"
|
2021-06-25 15:18:34 +02:00
|
|
|
#include "widgets/native/navigation_attached.hpp"
|
2021-04-14 14:58:22 +02:00
|
|
|
|
2020-03-24 09:52:50 +01:00
|
|
|
#include "videosurface.hpp"
|
|
|
|
|
|
|
|
#include <QQuickWindow>
|
|
|
|
#include <QQmlContext>
|
|
|
|
#include <QQmlFileSelector>
|
|
|
|
|
|
|
|
using namespace vlc::playlist;
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
2021-12-13 18:12:33 +01:00
|
|
|
template<class T>
|
|
|
|
class SingletonRegisterHelper
|
|
|
|
{
|
|
|
|
static QObject* m_instance;
|
|
|
|
static QQmlEngine::ObjectOwnership m_ownership;
|
|
|
|
|
|
|
|
static void connect()
|
|
|
|
{
|
|
|
|
QObject::connect(m_instance, &QObject::destroyed, []() {
|
|
|
|
m_instance = nullptr;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
public:
|
|
|
|
static QObject* callback(QQmlEngine *engine, QJSEngine *)
|
|
|
|
{
|
|
|
|
assert(m_instance);
|
|
|
|
engine->setObjectOwnership(m_instance, m_ownership);
|
|
|
|
return m_instance;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<typename... Args>
|
|
|
|
static auto getCallback(Args&&... args)
|
|
|
|
{
|
|
|
|
if (!m_instance)
|
|
|
|
{
|
|
|
|
m_ownership = QQmlEngine::ObjectOwnership::JavaScriptOwnership;
|
|
|
|
m_instance = new T(args...);
|
|
|
|
assert(!m_instance->parent());
|
|
|
|
connect();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
assert(sizeof...(args) == 0);
|
|
|
|
|
|
|
|
return callback;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void setInstance(T& instance)
|
|
|
|
{
|
|
|
|
assert(!m_instance);
|
|
|
|
m_ownership = QQmlEngine::ObjectOwnership::CppOwnership;
|
|
|
|
m_instance = &instance;
|
|
|
|
connect();
|
|
|
|
}
|
|
|
|
|
|
|
|
static auto getInstance()
|
|
|
|
{
|
|
|
|
return m_instance;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
template<class T>
|
|
|
|
QQmlEngine::ObjectOwnership SingletonRegisterHelper<T>::m_ownership = QQmlEngine::ObjectOwnership::JavaScriptOwnership;
|
|
|
|
template<class T>
|
|
|
|
QObject* SingletonRegisterHelper<T>::m_instance = nullptr;
|
|
|
|
|
2020-03-24 09:52:50 +01:00
|
|
|
template<class T>
|
|
|
|
void registerAnonymousType( const char *uri, int versionMajor )
|
|
|
|
{
|
|
|
|
#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
|
|
|
|
qmlRegisterAnonymousType<T>( uri, versionMajor );
|
|
|
|
#else
|
|
|
|
qmlRegisterType<T>();
|
|
|
|
VLC_UNUSED( uri );
|
|
|
|
VLC_UNUSED( versionMajor );
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
} // anonymous namespace
|
|
|
|
|
|
|
|
|
2021-11-26 10:02:43 +01:00
|
|
|
MainUI::MainUI(qt_intf_t *p_intf, MainCtx *mainCtx, QWindow* interfaceWindow, QObject *parent)
|
2020-03-24 09:52:50 +01:00
|
|
|
: QObject(parent)
|
|
|
|
, m_intf(p_intf)
|
2021-11-26 10:02:43 +01:00
|
|
|
, m_mainCtx(mainCtx)
|
2020-09-25 18:30:07 +02:00
|
|
|
, m_interfaceWindow(interfaceWindow)
|
2020-03-24 09:52:50 +01:00
|
|
|
{
|
|
|
|
assert(m_intf);
|
2021-11-26 10:02:43 +01:00
|
|
|
assert(m_mainCtx);
|
2020-09-25 18:30:07 +02:00
|
|
|
assert(m_interfaceWindow);
|
2020-03-24 09:52:50 +01:00
|
|
|
|
2021-12-08 20:30:31 +01:00
|
|
|
SingletonRegisterHelper<MainCtx>::setInstance(*mainCtx);
|
2021-11-26 11:12:22 +01:00
|
|
|
|
2020-03-24 09:52:50 +01:00
|
|
|
registerQMLTypes();
|
|
|
|
}
|
|
|
|
|
|
|
|
MainUI::~MainUI()
|
|
|
|
{
|
2021-12-08 20:30:31 +01:00
|
|
|
|
2020-03-24 09:52:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
bool MainUI::setup(QQmlEngine* engine)
|
|
|
|
{
|
|
|
|
engine->setOutputWarningsToStandardError(false);
|
|
|
|
connect(engine, &QQmlEngine::warnings, this, &MainUI::onQmlWarning);
|
|
|
|
|
|
|
|
QQmlContext *rootCtx = engine->rootContext();
|
|
|
|
|
2020-05-20 16:26:55 +02:00
|
|
|
rootCtx->setContextProperty( "history", new NavigationHistory(this) );
|
2021-05-12 14:50:41 +02:00
|
|
|
rootCtx->setContextProperty( "player", m_intf->p_mainPlayerController );
|
2020-05-20 16:26:55 +02:00
|
|
|
rootCtx->setContextProperty( "i18n", new I18n(this) );
|
2020-09-25 18:30:07 +02:00
|
|
|
rootCtx->setContextProperty( "topWindow", m_interfaceWindow);
|
2020-03-24 09:52:50 +01:00
|
|
|
rootCtx->setContextProperty( "dialogProvider", DialogsProvider::getInstance());
|
2020-05-20 16:26:55 +02:00
|
|
|
rootCtx->setContextProperty( "systemPalette", new SystemPalette(this));
|
2021-03-18 10:36:27 +01:00
|
|
|
rootCtx->setContextProperty( "dialogModel", new DialogModel(m_intf, this));
|
2020-03-24 09:52:50 +01:00
|
|
|
|
2021-11-26 10:02:43 +01:00
|
|
|
if (m_mainCtx->hasMediaLibrary())
|
|
|
|
rootCtx->setContextProperty( "medialib", m_mainCtx->getMediaLibrary() );
|
2020-03-24 09:52:50 +01:00
|
|
|
else
|
|
|
|
rootCtx->setContextProperty( "medialib", nullptr );
|
|
|
|
|
|
|
|
m_component = new QQmlComponent(engine, QStringLiteral("qrc:/main/MainInterface.qml"), QQmlComponent::PreferSynchronous, engine);
|
|
|
|
if (m_component->isLoading())
|
|
|
|
{
|
|
|
|
msg_Warn(m_intf, "component is still loading");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (m_component->isError())
|
|
|
|
{
|
|
|
|
for(auto& error: m_component->errors())
|
|
|
|
msg_Err(m_intf, "qml loading %s %s:%u", qtu(error.description()), qtu(error.url().toString()), error.line());
|
|
|
|
#ifdef QT_STATICPLUGIN
|
|
|
|
assert( !"Missing qml modules from qt contribs." );
|
|
|
|
#else
|
|
|
|
msg_Err( m_intf, "Install missing modules using your packaging tool" );
|
|
|
|
#endif
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
QQuickItem* MainUI::createRootItem()
|
|
|
|
{
|
|
|
|
QObject* rootObject = m_component->create();
|
|
|
|
|
|
|
|
if (m_component->isError())
|
|
|
|
{
|
|
|
|
for(auto& error: m_component->errors())
|
|
|
|
msg_Err(m_intf, "qml loading %s %s:%u", qtu(error.description()), qtu(error.url().toString()), error.line());
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (rootObject == nullptr)
|
|
|
|
{
|
|
|
|
msg_Err(m_intf, "unable to create main interface, no root item");
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
m_rootItem = qobject_cast<QQuickItem*>(rootObject);
|
|
|
|
if (!m_rootItem)
|
|
|
|
{
|
|
|
|
msg_Err(m_intf, "unexpected type of qml root item");
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
return m_rootItem;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void MainUI::registerQMLTypes()
|
|
|
|
{
|
2021-09-22 15:40:02 +02:00
|
|
|
{
|
|
|
|
const char* uri = "org.videolan.vlc";
|
|
|
|
const int versionMajor = 0;
|
|
|
|
const int versionMinor = 1;
|
|
|
|
|
2021-12-08 20:30:31 +01:00
|
|
|
qmlRegisterSingletonType<MainCtx>(uri, versionMajor, versionMinor, "MainCtx", SingletonRegisterHelper<MainCtx>::callback);
|
2021-11-26 11:12:22 +01:00
|
|
|
|
2021-09-22 15:40:02 +02:00
|
|
|
qRegisterMetaType<VLCTick>();
|
|
|
|
qmlRegisterUncreatableType<VLCTick>(uri, versionMajor, versionMinor, "VLCTick", "");
|
|
|
|
qmlRegisterUncreatableType<ColorSchemeModel>(uri, versionMajor, versionMinor, "ColorSchemeModel", "");
|
|
|
|
|
|
|
|
qRegisterMetaType<QmlInputItem>();
|
|
|
|
|
|
|
|
qmlRegisterType<VideoSurface>(uri, versionMajor, versionMinor, "VideoSurface");
|
|
|
|
|
|
|
|
qRegisterMetaType<NetworkTreeItem>();
|
|
|
|
qmlRegisterType<NetworkMediaModel>( uri, versionMajor, versionMinor, "NetworkMediaModel");
|
|
|
|
qmlRegisterType<NetworkDeviceModel>( uri, versionMajor, versionMinor, "NetworkDeviceModel");
|
|
|
|
qmlRegisterType<NetworkSourcesModel>( uri, versionMajor, versionMinor, "NetworkSourcesModel");
|
|
|
|
qmlRegisterType<ServicesDiscoveryModel>( uri, versionMajor, versionMinor, "ServicesDiscoveryModel");
|
|
|
|
qmlRegisterType<MLFoldersModel>( uri, versionMajor, versionMinor, "MLFolderModel");
|
|
|
|
qmlRegisterType<ImageLuminanceExtractor>( uri, versionMajor, versionMinor, "ImageLuminanceExtractor");
|
|
|
|
|
|
|
|
qmlRegisterUncreatableType<NavigationHistory>(uri, versionMajor, versionMinor, "History", "Type of global variable history" );
|
|
|
|
|
|
|
|
qmlRegisterUncreatableType<TrackListModel>(uri, versionMajor, versionMinor, "TrackListModel", "available tracks of a media (audio/video/sub)" );
|
|
|
|
qmlRegisterUncreatableType<TitleListModel>(uri, versionMajor, versionMinor, "TitleListModel", "available titles of a media" );
|
|
|
|
qmlRegisterUncreatableType<ChapterListModel>(uri, versionMajor, versionMinor, "ChapterListModel", "available titles of a media" );
|
|
|
|
qmlRegisterUncreatableType<ProgramListModel>(uri, versionMajor, versionMinor, "ProgramListModel", "available programs of a media" );
|
|
|
|
qmlRegisterUncreatableType<VLCVarChoiceModel>(uri, versionMajor, versionMinor, "VLCVarChoiceModel", "generic variable with choice model" );
|
|
|
|
qmlRegisterUncreatableType<PlayerController>(uri, versionMajor, versionMinor, "PlayerController", "player controller" );
|
|
|
|
|
|
|
|
qRegisterMetaType<PlaylistPtr>();
|
|
|
|
qRegisterMetaType<PlaylistItem>();
|
|
|
|
qmlRegisterUncreatableType<PlaylistItem>(uri, versionMajor, versionMinor, "PlaylistItem", "");
|
|
|
|
qmlRegisterType<PlaylistListModel>( uri, versionMajor, versionMinor, "PlaylistListModel" );
|
|
|
|
qmlRegisterType<PlaylistControllerModel>( uri, versionMajor, versionMinor, "PlaylistControllerModel" );
|
|
|
|
|
|
|
|
qmlRegisterType<AboutModel>( uri, versionMajor, versionMinor, "AboutModel" );
|
|
|
|
|
|
|
|
qmlRegisterUncreatableType<DialogModel>(uri, versionMajor, versionMinor, "DialogModel", "");
|
|
|
|
qmlRegisterUncreatableType<DialogErrorModel>( uri, versionMajor, versionMinor, "DialogErrorModel", "");
|
|
|
|
qRegisterMetaType<DialogId>();
|
|
|
|
|
2021-11-24 21:06:26 +01:00
|
|
|
qmlRegisterType<ItemKeyEventFilter>( uri, versionMajor, versionMinor, "KeyEventFilter" );
|
2021-10-19 23:47:51 +02:00
|
|
|
qmlRegisterType<MouseEventFilter>( uri, versionMajor, versionMinor, "MouseEventFilter" );
|
2021-09-22 15:40:02 +02:00
|
|
|
|
|
|
|
qmlRegisterUncreatableType<ControlbarProfileModel>(uri, versionMajor, versionMinor, "ControlbarProfileModel", "");
|
|
|
|
qmlRegisterUncreatableType<ControlbarProfile>(uri, versionMajor, versionMinor, "ControlbarProfile", "");
|
|
|
|
qmlRegisterUncreatableType<PlayerControlbarModel>(uri, versionMajor, versionMinor, "PlayerControlbarModel", "");
|
|
|
|
qmlRegisterUncreatableType<ControlListModel>( uri, versionMajor, versionMinor, "ControlListModel", "" );
|
|
|
|
qmlRegisterSingletonType(uri, versionMajor, versionMinor, "PlayerListModel", PlayerControlbarModel::getPlaylistIdentifierListModel);
|
|
|
|
|
|
|
|
qmlRegisterType<StringListMenu>( uri, versionMajor, versionMinor, "StringListMenu" );
|
|
|
|
qmlRegisterType<SortMenu>( uri, versionMajor, versionMinor, "SortMenu" );
|
|
|
|
qmlRegisterType<QmlGlobalMenu>( uri, versionMajor, versionMinor, "QmlGlobalMenu" );
|
|
|
|
qmlRegisterType<QmlMenuBar>( uri, versionMajor, versionMinor, "QmlMenuBar" );
|
|
|
|
qmlRegisterType<NetworkMediaContextMenu>( uri, versionMajor, versionMinor, "NetworkMediaContextMenu" );
|
|
|
|
qmlRegisterType<NetworkDeviceContextMenu>( uri, versionMajor, versionMinor, "NetworkDeviceContextMenu" );
|
|
|
|
qmlRegisterType<PlaylistContextMenu>( uri, versionMajor, versionMinor, "PlaylistContextMenu" );
|
|
|
|
qmlRegisterType<SortFilterProxyModel>( uri, versionMajor, versionMinor, "SortFilterProxyModel" );
|
|
|
|
|
|
|
|
qRegisterMetaType<QList<QQmlError>>("QList<QQmlError>");
|
|
|
|
|
|
|
|
qmlRegisterUncreatableType<NavigationAttached>( uri, versionMajor, versionMinor, "Navigation", "Navigation is only available via attached properties");
|
|
|
|
qmlRegisterSingletonType<QmlKeyHelper>(uri, versionMajor, versionMinor, "KeyHelper", &QmlKeyHelper::getSingletonInstance);
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
// Custom controls
|
2020-03-24 09:52:50 +01:00
|
|
|
|
2021-09-22 15:40:02 +02:00
|
|
|
const char* uri = "org.videolan.controls";
|
|
|
|
const int versionMajor = 0;
|
|
|
|
const int versionMinor = 1;
|
2021-03-11 10:16:46 +01:00
|
|
|
|
2021-09-22 15:40:02 +02:00
|
|
|
qmlRegisterType<RoundImage>( uri, versionMajor, versionMinor, "RoundImage" );
|
|
|
|
}
|
2020-03-24 09:52:50 +01:00
|
|
|
|
2021-11-26 10:02:43 +01:00
|
|
|
if (m_mainCtx->hasMediaLibrary())
|
2020-03-24 09:52:50 +01:00
|
|
|
{
|
2021-09-22 15:40:02 +02:00
|
|
|
const char* uri = "org.videolan.medialib";
|
|
|
|
const int versionMajor = 0;
|
|
|
|
const int versionMinor = 1;
|
|
|
|
|
2020-11-24 15:34:36 +01:00
|
|
|
qRegisterMetaType<MLItemId>();
|
2021-09-22 15:40:02 +02:00
|
|
|
qmlRegisterType<MLAlbumModel>( uri, versionMajor, versionMinor, "MLAlbumModel" );
|
|
|
|
qmlRegisterType<MLArtistModel>( uri, versionMajor, versionMinor, "MLArtistModel" );
|
|
|
|
qmlRegisterType<MLAlbumTrackModel>( uri, versionMajor, versionMinor, "MLAlbumTrackModel" );
|
|
|
|
qmlRegisterType<MLGenreModel>( uri, versionMajor, versionMinor, "MLGenreModel" );
|
|
|
|
qmlRegisterType<MLUrlModel>( uri, versionMajor, versionMinor, "MLUrlModel" );
|
|
|
|
qmlRegisterType<MLVideoModel>( uri, versionMajor, versionMinor, "MLVideoModel" );
|
|
|
|
qmlRegisterType<MLRecentsVideoModel>( uri, versionMajor, versionMinor, "MLRecentsVideoModel" );
|
|
|
|
qmlRegisterType<MLGroupListModel>( uri, versionMajor, versionMinor, "MLGroupListModel" );
|
|
|
|
qmlRegisterType<MLPlaylistListModel>( uri, versionMajor, versionMinor, "MLPlaylistListModel" );
|
|
|
|
qmlRegisterType<MLPlaylistModel>( uri, versionMajor, versionMinor, "MLPlaylistModel" );
|
2020-03-24 09:52:50 +01:00
|
|
|
|
2020-10-14 16:30:48 +02:00
|
|
|
qRegisterMetaType<NetworkTreeItem>();
|
2021-09-22 15:40:02 +02:00
|
|
|
qmlRegisterType<NetworkMediaModel>( uri, versionMajor, versionMinor, "NetworkMediaModel");
|
|
|
|
qmlRegisterType<NetworkDeviceModel>( uri, versionMajor, versionMinor, "NetworkDeviceModel");
|
|
|
|
qmlRegisterType<NetworkSourcesModel>( uri, versionMajor, versionMinor, "NetworkSourcesModel");
|
|
|
|
qmlRegisterType<ServicesDiscoveryModel>( uri, versionMajor, versionMinor, "ServicesDiscoveryModel");
|
|
|
|
qmlRegisterType<MLFoldersModel>( uri, versionMajor, versionMinor, "MLFolderModel");
|
|
|
|
qmlRegisterType<MLRecentsModel>( uri, versionMajor, versionMinor, "MLRecentModel" );
|
2020-10-14 16:30:48 +02:00
|
|
|
|
2020-03-24 09:52:50 +01:00
|
|
|
//expose base object, they aren't instanciable from QML side
|
2021-09-22 15:40:02 +02:00
|
|
|
registerAnonymousType<MLAlbum>(uri, versionMajor);
|
|
|
|
registerAnonymousType<MLArtist>(uri, versionMajor);
|
|
|
|
registerAnonymousType<MLAlbumTrack>(uri, versionMajor);
|
|
|
|
|
|
|
|
qmlRegisterType<AlbumContextMenu>( uri, versionMajor, versionMinor, "AlbumContextMenu" );
|
|
|
|
qmlRegisterType<ArtistContextMenu>( uri, versionMajor, versionMinor, "ArtistContextMenu" );
|
|
|
|
qmlRegisterType<GenreContextMenu>( uri, versionMajor, versionMinor, "GenreContextMenu" );
|
|
|
|
qmlRegisterType<AlbumTrackContextMenu>( uri, versionMajor, versionMinor, "AlbumTrackContextMenu" );
|
|
|
|
qmlRegisterType<URLContextMenu>( uri, versionMajor, versionMinor, "URLContextMenu" );
|
|
|
|
qmlRegisterType<VideoContextMenu>( uri, versionMajor, versionMinor, "VideoContextMenu" );
|
|
|
|
qmlRegisterType<GroupListContextMenu>( uri, versionMajor, versionMinor, "GroupListContextMenu" );
|
|
|
|
qmlRegisterType<PlaylistListContextMenu>( uri, versionMajor, versionMinor, "PlaylistListContextMenu" );
|
|
|
|
qmlRegisterType<PlaylistMediaContextMenu>( uri, versionMajor, versionMinor, "PlaylistMediaContextMenu" );
|
2020-03-24 09:52:50 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void MainUI::onQmlWarning(const QList<QQmlError>& qmlErrors)
|
|
|
|
{
|
|
|
|
for (auto& error: qmlErrors)
|
|
|
|
{
|
|
|
|
msg_Warn( m_intf, "qml error %s:%i %s", qtu(error.url().toString()), error.line(), qtu(error.description()) );
|
|
|
|
}
|
|
|
|
}
|
2021-11-26 11:12:22 +01:00
|
|
|
|