#ifndef QTMVVM_WIDGETSPRESENTER_H #define QTMVVM_WIDGETSPRESENTER_H #include #include #include #include #include #include "QtMvvmWidgets/qtmvvmwidgets_global.h" #include "QtMvvmWidgets/inputwidgetfactory.h" namespace QtMvvm { class WidgetsPresenterPrivate; class Q_MVVMWIDGETS_EXPORT WidgetsPresenter : public QObject, public IPresenter { Q_OBJECT Q_INTERFACES(QtMvvm::IPresenter) Q_PROPERTY(InputWidgetFactory* inputWidgetFactory READ inputWidgetFactory WRITE setInputWidgetFactory NOTIFY inputWidgetFactoryChanged) public: explicit WidgetsPresenter(QObject *parent = nullptr); ~WidgetsPresenter(); template static void registerAsPresenter(); template static void registerView(); static void registerView(const QMetaObject *viewType); template static void registerViewExplicitly(); static void registerViewExplicitly(const QMetaObject *viewModelType, const QMetaObject *viewType); void present(ViewModel *viewModel, const QVariantHash ¶ms, QPointer parent) override; void showDialog(const MessageConfig &config, MessageResult *result) override; InputWidgetFactory* inputWidgetFactory() const; public Q_SLOTS: void setInputWidgetFactory(InputWidgetFactory* inputWidgetFactory); Q_SIGNALS: void inputWidgetFactoryChanged(InputWidgetFactory* inputWidgetFactory); protected: virtual const QMetaObject *findWidgetMetaObject(const QMetaObject *viewModelMetaObject); virtual bool tryPresent(QWidget *view, QWidget *parentView); virtual bool setupLifeCycle(ViewModel *viewModel, QWidget *view); virtual void showForeground(QWidget *view) const; virtual void presentMessageBox(const MessageConfig &config, QPointer result); virtual void presentInputDialog(const MessageConfig &config, QPointer result); virtual void presentFileDialog(const MessageConfig &config, QPointer result); virtual void presentOtherDialog(const MessageConfig &config, QPointer result); private: QScopedPointer d; }; // ------------- Generic Implementation ------------- template void WidgetsPresenter::registerAsPresenter() { static_assert(std::is_base_of::value, "TPresenter must inherit QtMvvm::WidgetsPresenter!"); CoreApp::setMainPresenter(new TPresenter()); } template void WidgetsPresenter::registerView() { static_assert(std::is_base_of::value, "TWidget must inherit QWidget!"); registerView(&TView::staticMetaObject); } template void WidgetsPresenter::registerViewExplicitly() { static_assert(std::is_base_of::value, "TWidget must inherit QWidget!"); static_assert(std::is_base_of::value, "TViewModel must inherit ViewModel!"); registerViewExplicitly(&TViewModel::staticMetaObject, &TView::staticMetaObject); } } #endif // QTMVVM_WIDGETSPRESENTER_H