#ifndef QTMVVM_VIEWMODEL_H #define QTMVVM_VIEWMODEL_H #include #include #include #include #include #include "QtMvvmCore/qtmvvmcore_global.h" namespace QtMvvm { class CoreApp; class ViewModelPrivate; class Q_MVVMCORE_EXPORT ViewModel : public QObject { Q_OBJECT public: explicit ViewModel(QObject *parent = nullptr); ~ViewModel(); public Q_SLOTS: virtual void onInit(const QVariantHash ¶ms); virtual void onResult(quint32 requestCode, const QVariant &result); Q_SIGNALS: void resultReady(const QVariant &result); protected: template inline void show(const QVariantHash ¶ms = {}) const; void show(const char *viewModelName, const QVariantHash ¶ms = {}) const; void show(const QMetaObject *viewMetaObject, const QVariantHash ¶ms = {}) const; template inline void showForResult(quint32 requestCode, const QVariantHash ¶ms = {}) const; void showForResult(quint32 requestCode, const char *viewModelName, const QVariantHash ¶ms = {}) const; void showForResult(quint32 requestCode, const QMetaObject *viewMetaObject, const QVariantHash ¶ms = {}) const; private: friend class QtMvvm::CoreApp; QScopedPointer d; static void showImp(const QMetaObject *mo, const QVariantHash ¶ms, QPointer parent); void showResultImp(quint32 requestCode, const QMetaObject *mo, const QVariantHash ¶ms) const; }; // ------------- Generic Implementation ------------- template inline void ViewModel::show(const QVariantHash ¶ms) const { static_assert(std::is_base_of::value, "TViewModel must extend QtMvvm::ViewModel"); showImp(&TViewModel::staticMetaObject, params, const_cast(this)); } template void ViewModel::showForResult(quint32 requestCode, const QVariantHash ¶ms) const { static_assert(std::is_base_of::value, "TViewModel must extend QtMvvm::ViewModel"); showResultImp(requestCode, &TViewModel::staticMetaObject, params); } } #endif // QTMVVM_VIEWMODEL_H