#ifndef QTMVVM_VIEWMODEL_H #define QTMVVM_VIEWMODEL_H #include #include #include #include #include #include "QtMvvmCore/qtmvvmcore_global.h" #include "QtMvvmCore/injection.h" namespace QtMvvm { class CoreApp; class CoreAppPrivate; class ViewModelPrivate; //! The base class for all viewmodels class Q_MVVMCORE_EXPORT ViewModel : public QObject { Q_OBJECT public: //! Default constructor with parent explicit ViewModel(QObject *parent = nullptr); ~ViewModel() override; public Q_SLOTS: //! Called by the presenter to initialize the viewmodel virtual void onInit(const QVariantHash ¶ms); //! Called by the presenter when a result of a showed viewmodel is ready virtual void onResult(quint32 requestCode, const QVariant &result); Q_SIGNALS: //! Should be emitted when the viewmodels result is ready void resultReady(const QVariant &result); Q_REVISION(1) void instanceInvoked(QPrivateSignal); protected: //! Show another viewmodel as a child of this one template inline void show(QVariantHash params = {}) const; //! @copybrief ViewModel::show(const QVariantHash &) const void show(const char *viewModelName, const QVariantHash ¶ms = {}) const; //! @copybrief ViewModel::show(const QVariantHash &) const void show(const QMetaObject *viewMetaObject, const QVariantHash ¶ms = {}) const; //! Show another viewmodel as a child of this one and expect its result template inline void showForResult(quint32 requestCode, QVariantHash params = {}) const; //! @copybrief ViewModel::showForResult(quint32, const QVariantHash &) const void showForResult(quint32 requestCode, const char *viewModelName, const QVariantHash ¶ms = {}) const; //! @copybrief ViewModel::showForResult(quint32, const QVariantHash &) const void showForResult(quint32 requestCode, const QMetaObject *viewMetaObject, const QVariantHash ¶ms = {}) const; private: friend class QtMvvm::CoreApp; friend class QtMvvm::CoreAppPrivate; QScopedPointer d; static void showImp(const QMetaObject *metaObject, QVariantHash params, QPointer parent, quint32 requestCode = 0); }; //TODO doc #define QTMVVM_SINGLETON Q_CLASSINFO("qtmvvm_singleton", "true") // ------------- Generic Implementation ------------- template inline void ViewModel::show(QVariantHash params) const { static_assert(std::is_base_of::value, "TViewModel must extend QtMvvm::ViewModel"); showImp(&TViewModel::staticMetaObject, std::move(params), const_cast(this)); } template void ViewModel::showForResult(quint32 requestCode, QVariantHash params) const { static_assert(std::is_base_of::value, "TViewModel must extend QtMvvm::ViewModel"); showImp(&TViewModel::staticMetaObject, std::move(params), const_cast(this), requestCode); } } #endif // QTMVVM_VIEWMODEL_H