diff --git a/src/app/App.cpp b/src/app/App.cpp index 6da77a7e1..cc9a92d45 100644 --- a/src/app/App.cpp +++ b/src/app/App.cpp @@ -61,6 +61,8 @@ namespace { constexpr char QmlViewSettingsWindow[] = "qrc:/ui/views/App/Settings/SettingsWindow.qml"; constexpr int VersionUpdateCheckInterval = 86400000; // 24 hours in milliseconds. + + constexpr char MainQmlUri[] = "Linphone"; } static inline bool installLocale (App &app, QTranslator &translator, const QLocale &locale) { @@ -331,46 +333,65 @@ void App::createParser () { // ----------------------------------------------------------------------------- -#define registerSharedSingletonType(TYPE, NAME, METHOD) qmlRegisterSingletonType( \ - "Linphone", 1, 0, NAME, \ - [](QQmlEngine *, QJSEngine *) -> QObject *{ \ - QObject *object = METHOD(); \ - QQmlEngine::setObjectOwnership(object, QQmlEngine::CppOwnership); \ - return object; \ - } \ -) - -#define registerUncreatableType(TYPE, NAME) qmlRegisterUncreatableType( \ - "Linphone", 1, 0, NAME, NAME " is uncreatable." \ -) - -template -void registerSingletonType (const char *name) { - qmlRegisterSingletonType("Linphone", 1, 0, name, [](QQmlEngine *engine, QJSEngine *) -> QObject *{ - return new T(engine); - }); +template +static QObject *makeSharedSingleton (QQmlEngine *, QJSEngine *) { + QObject *object = (*function)(); + QQmlEngine::setObjectOwnership(object, QQmlEngine::CppOwnership); + return object; } -template -void registerType (const char *name) { - qmlRegisterType("Linphone", 1, 0, name); +template +static inline void registerSharedSingletonType (const char *name) { + qmlRegisterSingletonType(MainQmlUri, 1, 0, name, makeSharedSingleton); } -template -void registerToolType (const char *name) { +template +static QObject *makeSharedSingleton (QQmlEngine *, QJSEngine *) { + QObject *object = (CoreManager::getInstance()->*function)(); + QQmlEngine::setObjectOwnership(object, QQmlEngine::CppOwnership); + return object; +} + +template +static inline void registerSharedSingletonType (const char *name) { + qmlRegisterSingletonType(MainQmlUri, 1, 0, name, makeSharedSingleton); +} + +template +static inline void registerUncreatableType (const char *name) { + qmlRegisterUncreatableType(MainQmlUri, 1, 0, name, QLatin1String("Uncreatable")); +} + +template +static inline void registerSingletonType (const char *name) { + qmlRegisterSingletonType(MainQmlUri, 1, 0, name, [](QQmlEngine *engine, QJSEngine *) -> QObject *{ + return new T(engine); + }); +} + +template +static inline void registerType (const char *name) { + qmlRegisterType(MainQmlUri, 1, 0, name); +} + +template +static inline void registerToolType (const char *name) { qmlRegisterSingletonType(name, 1, 0, name, [](QQmlEngine *engine, QJSEngine *) -> QObject *{ return new T(engine); }); } -#define registerSharedToolType(TYPE, NAME, METHOD) qmlRegisterSingletonType( \ - NAME, 1, 0, NAME, \ - [](QQmlEngine *, QJSEngine *) -> QObject *{ \ - QObject *object = const_cast(METHOD()); \ - QQmlEngine::setObjectOwnership(object, QQmlEngine::CppOwnership); \ - return object; \ - } \ -) +template +static QObject *makeSharedTool (QQmlEngine *, QJSEngine *) { + QObject *object = (Owner::getInstance()->*function)(); + QQmlEngine::setObjectOwnership(object, QQmlEngine::CppOwnership); + return object; +} + +template +static inline void registerSharedToolType (const char *name) { + qmlRegisterSingletonType(name, 1, 0, name, makeSharedTool); +} void App::registerTypes () { qInfo() << QStringLiteral("Registering types..."); @@ -400,24 +421,24 @@ void App::registerTypes () { registerSingletonType("UrlHandlers"); registerSingletonType("VideoCodecsModel"); - registerUncreatableType(CallModel, "CallModel"); - registerUncreatableType(ChatModel, "ChatModel"); - registerUncreatableType(ConferenceHelperModel::ConferenceAddModel, "ConferenceAddModel"); - registerUncreatableType(ContactModel, "ContactModel"); - registerUncreatableType(SipAddressObserver, "SipAddressObserver"); - registerUncreatableType(VcardModel, "VcardModel"); + registerUncreatableType("CallModel"); + registerUncreatableType("ChatModel"); + registerUncreatableType("ConferenceAddModel"); + registerUncreatableType("ContactModel"); + registerUncreatableType("SipAddressObserver"); + registerUncreatableType("VcardModel"); } void App::registerSharedTypes () { qInfo() << QStringLiteral("Registering shared types..."); - registerSharedSingletonType(App, "App", App::getInstance); - registerSharedSingletonType(CoreManager, "CoreManager", CoreManager::getInstance); - registerSharedSingletonType(SettingsModel, "SettingsModel", CoreManager::getInstance()->getSettingsModel); - registerSharedSingletonType(AccountSettingsModel, "AccountSettingsModel", CoreManager::getInstance()->getAccountSettingsModel); - registerSharedSingletonType(SipAddressesModel, "SipAddressesModel", CoreManager::getInstance()->getSipAddressesModel); - registerSharedSingletonType(CallsListModel, "CallsListModel", CoreManager::getInstance()->getCallsListModel); - registerSharedSingletonType(ContactsListModel, "ContactsListModel", CoreManager::getInstance()->getContactsListModel); + registerSharedSingletonType("App"); + registerSharedSingletonType("CoreManager"); + registerSharedSingletonType("SettingsModel"); + registerSharedSingletonType("AccountSettingsModel"); + registerSharedSingletonType("SipAddressesModel"); + registerSharedSingletonType("CallsListModel"); + registerSharedSingletonType("ContactsListModel"); } void App::registerToolTypes () { @@ -432,13 +453,9 @@ void App::registerToolTypes () { void App::registerSharedToolTypes () { qInfo() << QStringLiteral("Registering shared tool types..."); - registerSharedToolType(Colors, "Colors", App::getInstance()->getColors); + registerSharedToolType("Colors"); } -#undef registerUncreatableType -#undef registerSharedToolType -#undef registerSharedSingletonType - // ----------------------------------------------------------------------------- void App::setTrayIcon () { diff --git a/src/app/App.hpp b/src/app/App.hpp index 21ad96179..867e15877 100644 --- a/src/app/App.hpp +++ b/src/app/App.hpp @@ -70,7 +70,7 @@ public: return mNotifier; } - const Colors *getColors () const { + Colors *getColors () const { return mColors; }