Browse Source

added basic messagebox presenting

pull/2/head
Skycoder42 7 years ago
parent
commit
8e5eb5d048
  1. 6
      examples/mvvmcore/SampleCore/sampleviewmodel.cpp
  2. 7
      src/mvvmcore/coreapp.cpp
  3. 2
      src/mvvmcore/coreapp_p.h
  4. 61
      src/mvvmcore/message.cpp
  5. 17
      src/mvvmcore/message.h
  6. 2
      src/mvvmcore/viewmodel.cpp
  7. 8
      src/mvvmwidgets/qpmx.json
  8. 78
      src/mvvmwidgets/widgetspresenter.cpp
  9. 5
      src/mvvmwidgets/widgetspresenter.h
  10. 4
      sync.profile

6
examples/mvvmcore/SampleCore/sampleviewmodel.cpp

@ -1,5 +1,6 @@
#include "sampleviewmodel.h" #include "sampleviewmodel.h"
#include <QDebug> #include <QDebug>
#include <QtMvvmCore/Messages>
#include "resultviewmodel.h" #include "resultviewmodel.h"
const QString SampleViewModel::KeyActive = QStringLiteral("active"); const QString SampleViewModel::KeyActive = QStringLiteral("active");
@ -72,7 +73,12 @@ void SampleViewModel::getResult()
void SampleViewModel::clearEvents() void SampleViewModel::clearEvents()
{ {
QtMvvm::question(tr("Clear Eventlist"),
tr("Do you really want to clear the eventlist?"),
this, [this](bool res) {
if(res)
_eventsModel->setStringList({}); _eventsModel->setStringList({});
});
} }
void SampleViewModel::onInit(const QVariantHash &params) void SampleViewModel::onInit(const QVariantHash &params)

7
src/mvvmcore/coreapp.cpp

@ -39,6 +39,7 @@ void CoreApp::registerApp()
{ {
//register metatypes //register metatypes
qRegisterMetaType<const QMetaObject*>("const QMetaObject*"); qRegisterMetaType<const QMetaObject*>("const QMetaObject*");
qRegisterMetaType<MessageConfig::StandardButton>();
//setup //setup
setParent(qApp); setParent(qApp);
@ -78,7 +79,9 @@ void CoreApp::show(const QMetaObject *viewMetaObject, const QVariantHash &params
MessageResult *CoreApp::showDialog(const MessageConfig &config) MessageResult *CoreApp::showDialog(const MessageConfig &config)
{ {
auto result = new MessageResult(); auto result = new MessageResult();
CoreAppPrivate::dInstance()->showDialog(config, result); QMetaObject::invokeMethod(CoreAppPrivate::dInstance().data(), "showDialog", Qt::QueuedConnection,
Q_ARG(QtMvvm::MessageConfig, config),
Q_ARG(QtMvvm::MessageResult*, result));
return result; return result;
} }
@ -122,7 +125,7 @@ void CoreApp::showImp(const QMetaObject *metaObject, const QVariantHash &params)
{ {
QMetaObject::invokeMethod(CoreAppPrivate::dInstance().data(), "showViewModel", Qt::QueuedConnection, QMetaObject::invokeMethod(CoreAppPrivate::dInstance().data(), "showViewModel", Qt::QueuedConnection,
Q_ARG(const QMetaObject*, metaObject), Q_ARG(const QMetaObject*, metaObject),
Q_ARG(const QVariantHash&, params), Q_ARG(QVariantHash, params),
Q_ARG(QPointer<ViewModel>, nullptr), Q_ARG(QPointer<ViewModel>, nullptr),
Q_ARG(quint32, 0)); Q_ARG(quint32, 0));
} }

2
src/mvvmcore/coreapp_p.h

@ -23,7 +23,7 @@ public Q_SLOTS:
const QVariantHash &params, const QVariantHash &params,
QPointer<ViewModel> parent, QPointer<ViewModel> parent,
quint32 requestCode); quint32 requestCode);
void showDialog(const MessageConfig &config, MessageResult *result); void showDialog(const QtMvvm::MessageConfig &config, QtMvvm::MessageResult *result);
private: private:
CoreAppPrivate(); CoreAppPrivate();

61
src/mvvmcore/message.cpp

@ -191,24 +191,9 @@ void MessageResult::setCloseTarget(QObject *closeObject, const QMetaMethod &clos
d->closeMethod.invoke(d->closeObject, Qt::QueuedConnection); d->closeMethod.invoke(d->closeObject, Qt::QueuedConnection);
} }
void MessageResult::complete(MessageResult::ResultType result) void MessageResult::complete(MessageConfig::StandardButton result)
{ {
switch (result) { emit dialogDone(result);
case PositiveResult:
emit positiveAction();
break;
case NegativeResult:
emit negativeAction();
break;
case NeutralResult:
emit neutralAction();
break;
default:
Q_UNREACHABLE();
}
emit anyAction(result);
if(d->autoDelete) if(d->autoDelete)
deleteLater(); deleteLater();
} }
@ -286,7 +271,7 @@ void QtMvvm::information(const QString &title, const QString &text, QObject *sco
{ {
auto result = information(title, text, okText); auto result = information(title, text, okText);
if(result) { if(result) {
QObject::connect(result, &MessageResult::anyAction, QObject::connect(result, &MessageResult::dialogDone,
scope, onResult, scope, onResult,
Qt::QueuedConnection); Qt::QueuedConnection);
} }
@ -313,9 +298,9 @@ void QtMvvm::question(const QString &title, const QString &text, QObject *scope,
{ {
auto result = question(title, text, yesText, noText); auto result = question(title, text, yesText, noText);
if(result) { if(result) {
QObject::connect(result, &MessageResult::anyAction, QObject::connect(result, &MessageResult::dialogDone,
scope, [onResult](MessageResult::ResultType type) { scope, [onResult](MessageConfig::StandardButton type) {
onResult(type == MessageResult::PositiveResult); onResult(type == MessageConfig::Yes);
}, Qt::QueuedConnection); }, Qt::QueuedConnection);
} }
} }
@ -339,7 +324,7 @@ void QtMvvm::warning(const QString &title, const QString &text, QObject *scope,
{ {
auto result = warning(title, text, okText); auto result = warning(title, text, okText);
if(result) { if(result) {
QObject::connect(result, &MessageResult::anyAction, QObject::connect(result, &MessageResult::dialogDone,
scope, onResult, scope, onResult,
Qt::QueuedConnection); Qt::QueuedConnection);
} }
@ -364,7 +349,7 @@ void QtMvvm::critical(const QString &title, const QString &text, QObject *scope,
{ {
auto result = critical(title, text, okText); auto result = critical(title, text, okText);
if(result) { if(result) {
QObject::connect(result, &MessageResult::anyAction, QObject::connect(result, &MessageResult::dialogDone,
scope, onResult, scope, onResult,
Qt::QueuedConnection); Qt::QueuedConnection);
} }
@ -463,9 +448,9 @@ void QtMvvm::getInput(const QString &title, const QString &text, const char *inp
{ {
auto result = getInput(title, text, inputType, defaultValue, viewProperties, okText, cancelText); auto result = getInput(title, text, inputType, defaultValue, viewProperties, okText, cancelText);
if(result) { if(result) {
QObject::connect(result, &MessageResult::anyAction, QObject::connect(result, &MessageResult::dialogDone,
scope, [onResult, result](MessageResult::ResultType type) { scope, [onResult, result](MessageConfig::StandardButton type) {
onResult(type == MessageResult::PositiveResult ? result->result() : QVariant()); onResult(type == MessageConfig::Ok ? result->result() : QVariant());
}, Qt::QueuedConnection); }, Qt::QueuedConnection);
} }
} }
@ -487,9 +472,9 @@ void QtMvvm::getExistingDirectory(QObject *scope, std::function<void (QUrl)> onR
{ {
auto result = getExistingDirectory(title, dir); auto result = getExistingDirectory(title, dir);
if(result) { if(result) {
QObject::connect(result, &MessageResult::anyAction, QObject::connect(result, &MessageResult::dialogDone,
scope, [onResult, result](MessageResult::ResultType type) { scope, [onResult, result](MessageConfig::StandardButton type) {
onResult(type == MessageResult::PositiveResult ? result->result().toUrl() : QUrl()); onResult(type == MessageConfig::Ok ? result->result().toUrl() : QUrl());
}, Qt::QueuedConnection); }, Qt::QueuedConnection);
} }
} }
@ -512,9 +497,9 @@ void QtMvvm::getOpenFile(QObject *scope, std::function<void (QUrl)> onResult, co
{ {
auto result = getOpenFile(title, supportedMimeTypes, dir); auto result = getOpenFile(title, supportedMimeTypes, dir);
if(result) { if(result) {
QObject::connect(result, &MessageResult::anyAction, QObject::connect(result, &MessageResult::dialogDone,
scope, [onResult, result](MessageResult::ResultType type) { scope, [onResult, result](MessageConfig::StandardButton type) {
onResult(type == MessageResult::PositiveResult ? result->result().toUrl() : QUrl()); onResult(type == MessageConfig::Ok ? result->result().toUrl() : QUrl());
}, Qt::QueuedConnection); }, Qt::QueuedConnection);
} }
} }
@ -537,9 +522,9 @@ void QtMvvm::getOpenFiles(QObject *scope, std::function<void (QList<QUrl>)> onRe
{ {
auto result = getOpenFiles(title, supportedMimeTypes, dir); auto result = getOpenFiles(title, supportedMimeTypes, dir);
if(result) { if(result) {
QObject::connect(result, &MessageResult::anyAction, QObject::connect(result, &MessageResult::dialogDone,
scope, [onResult, result](MessageResult::ResultType type) { scope, [onResult, result](MessageConfig::StandardButton type) {
onResult(type == MessageResult::PositiveResult ? result->result().value<QList<QUrl>>() : QList<QUrl>()); onResult(type == MessageConfig::Ok ? result->result().value<QList<QUrl>>() : QList<QUrl>());
}, Qt::QueuedConnection); }, Qt::QueuedConnection);
} }
} }
@ -562,9 +547,9 @@ void QtMvvm::getSaveFile(QObject *scope, std::function<void (QUrl)> onResult, co
{ {
auto result = getSaveFile(title, supportedMimeTypes, dir); auto result = getSaveFile(title, supportedMimeTypes, dir);
if(result) { if(result) {
QObject::connect(result, &MessageResult::anyAction, QObject::connect(result, &MessageResult::dialogDone,
scope, [onResult, result](MessageResult::ResultType type) { scope, [onResult, result](MessageConfig::StandardButton type) {
onResult(type == MessageResult::PositiveResult ? result->result().toUrl() : QUrl()); onResult(type == MessageConfig::Ok ? result->result().toUrl() : QUrl());
}, Qt::QueuedConnection); }, Qt::QueuedConnection);
} }
} }

17
src/mvvmcore/message.h

@ -114,13 +114,6 @@ class Q_MVVMCORE_EXPORT MessageResult : public QObject
Q_PROPERTY(bool autoDelete READ autoDelete WRITE setAutoDelete NOTIFY autoDeleteChanged) Q_PROPERTY(bool autoDelete READ autoDelete WRITE setAutoDelete NOTIFY autoDeleteChanged)
public: public:
enum ResultType {
PositiveResult,
NegativeResult,
NeutralResult
};
Q_ENUM(ResultType)
explicit MessageResult(); explicit MessageResult();
~MessageResult(); ~MessageResult();
@ -131,8 +124,8 @@ public:
//USE IN GUI ONLY //USE IN GUI ONLY
//TODO USE IN GUI ONLY in doc //TODO USE IN GUI ONLY in doc
Q_INVOKABLE void setCloseTarget(QObject *closeObject, const QMetaMethod &closeMethod); Q_INVOKABLE void setCloseTarget(QObject *closeObject, const QMetaMethod &closeMethod);
Q_INVOKABLE void complete(MessageResult::ResultType result); Q_INVOKABLE void complete(QtMvvm::MessageConfig::StandardButton result);
Q_INVOKABLE inline void complete(MessageResult::ResultType result, const QVariant &resultValue) { Q_INVOKABLE inline void complete(QtMvvm::MessageConfig::StandardButton result, const QVariant &resultValue) {
setResult(resultValue); setResult(resultValue);
complete(result); complete(result);
} }
@ -144,10 +137,7 @@ public Q_SLOTS:
void setAutoDelete(bool autoDelete); void setAutoDelete(bool autoDelete);
Q_SIGNALS: Q_SIGNALS:
void positiveAction(); void dialogDone(QtMvvm::MessageConfig::StandardButton result);
void negativeAction();
void neutralAction();
void anyAction(ResultType result);
void autoDeleteChanged(bool autoDelete); void autoDeleteChanged(bool autoDelete);
@ -331,6 +321,7 @@ Q_MVVMCORE_EXPORT void getSaveFile(std::function<void(QUrl)> onResult,
} }
Q_DECLARE_METATYPE(QtMvvm::MessageConfig) Q_DECLARE_METATYPE(QtMvvm::MessageConfig)
Q_DECLARE_METATYPE(QtMvvm::MessageConfig::StandardButton)
Q_DECLARE_TYPEINFO(QtMvvm::MessageConfig, Q_MOVABLE_TYPE); Q_DECLARE_TYPEINFO(QtMvvm::MessageConfig, Q_MOVABLE_TYPE);
Q_DECLARE_METATYPE(QtMvvm::MessageResult*) Q_DECLARE_METATYPE(QtMvvm::MessageResult*)
Q_DECLARE_OPERATORS_FOR_FLAGS(QtMvvm::MessageConfig::StandardButtons) Q_DECLARE_OPERATORS_FOR_FLAGS(QtMvvm::MessageConfig::StandardButtons)

2
src/mvvmcore/viewmodel.cpp

@ -68,7 +68,7 @@ void ViewModel::showImp(const QMetaObject *metaObject, const QVariantHash &param
{ {
QMetaObject::invokeMethod(CoreAppPrivate::dInstance().data(), "showViewModel", Qt::QueuedConnection, QMetaObject::invokeMethod(CoreAppPrivate::dInstance().data(), "showViewModel", Qt::QueuedConnection,
Q_ARG(const QMetaObject*, metaObject), Q_ARG(const QMetaObject*, metaObject),
Q_ARG(const QVariantHash&, params), Q_ARG(QVariantHash, params),
Q_ARG(QPointer<ViewModel>, parent), Q_ARG(QPointer<ViewModel>, parent),
Q_ARG(quint32, requestCode)); Q_ARG(quint32, requestCode));
} }

8
src/mvvmwidgets/qpmx.json

@ -1,5 +1,11 @@
{ {
"dependencies": [], "dependencies": [
{
"package": "de.skycoder42.dialog-master",
"provider": "qpm",
"version": "1.3.2"
}
],
"license": { "license": {
"file": "", "file": "",
"name": "" "name": ""

78
src/mvvmwidgets/widgetspresenter.cpp

@ -10,8 +10,11 @@
#include <QtWidgets/QDockWidget> #include <QtWidgets/QDockWidget>
#include <QtWidgets/QMdiSubWindow> #include <QtWidgets/QMdiSubWindow>
#include <QtWidgets/QMdiArea> #include <QtWidgets/QMdiArea>
#include <QtWidgets/QMessageBox>
#include <QtWidgets/QApplication> #include <QtWidgets/QApplication>
#include <dialogmaster.h>
using namespace QtMvvm; using namespace QtMvvm;
WidgetsPresenter::WidgetsPresenter(QObject *parent) : WidgetsPresenter::WidgetsPresenter(QObject *parent) :
@ -79,7 +82,14 @@ void WidgetsPresenter::present(ViewModel *viewModel, const QVariantHash &params,
void WidgetsPresenter::showDialog(const MessageConfig &config, MessageResult *result) void WidgetsPresenter::showDialog(const MessageConfig &config, MessageResult *result)
{ {
Q_UNIMPLEMENTED(); if(config.type() == MessageConfig::TypeMessageBox)
presentMessageBox(config, result);
else if(config.type() == MessageConfig::TypeInputDialog)
presentInputDialog(config, result);
else if(config.type() == MessageConfig::TypeFileDialog)
presentFileDialog(config, result);
else
presentOtherDialog(config, result);
} }
const QMetaObject *WidgetsPresenter::findWidgetMetaObject(const QMetaObject *viewModelMetaObject) const QMetaObject *WidgetsPresenter::findWidgetMetaObject(const QMetaObject *viewModelMetaObject)
@ -170,6 +180,72 @@ void WidgetsPresenter::showForeground(QWidget *view) const
view->activateWindow(); view->activateWindow();
} }
void WidgetsPresenter::presentMessageBox(const MessageConfig &config, MessageResult *result)
{
DialogMaster::MessageBoxInfo info;
//set the icon based of the type
if(config.type() == MessageConfig::SubTypeInformation)
info = DialogMaster::createInformation();
else if(config.type() == MessageConfig::SubTypeWarning)
info = DialogMaster::createWarning();
else if(config.type() == MessageConfig::SubTypeCritical)
info = DialogMaster::createCritical();
else if(config.type() == MessageConfig::SubTypeQuestion)
info = DialogMaster::createQuestion();
else if(config.type() == MessageConfig::SubTypeAbout) {
info = DialogMaster::createInformation();
info.icon = QGuiApplication::windowIcon();
}
info.title = config.title();
info.text = config.text();
info.buttons = static_cast<QMessageBox::StandardButtons>(static_cast<int>(config.buttons())); //is ok, as the buttons are the same
auto btns = config.buttonTexts();
for(auto it = btns.constBegin(); it != btns.constEnd(); it++)
info.buttonTexts.insert(static_cast<QMessageBox::StandardButton>(it.key()), it.value());
//special properties
bool checked = false;
auto props = config.viewProperties(); //TODO document all these
if(!props.value(QStringLiteral("modal"), false).toBool())
info.parent = QApplication::activeWindow();
if(props.contains(QStringLiteral("windowTitle")))
info.windowTitle = props.value(QStringLiteral("windowTitle")).toString();
if(props.contains(QStringLiteral("details")))
info.details = props.value(QStringLiteral("details")).toString();
if(props.contains(QStringLiteral("checkable"))) {
if(props.value(QStringLiteral("checkable")).toBool()) {
checked = config.defaultValue().toBool();
info.checked = &checked;
if(props.contains(QStringLiteral("checkString")))
info.checkString = props.value(QStringLiteral("checkString")).toString();
}
}
//show the msgbox
int res = DialogMaster::messageBox(info);
if(info.checked)
result->setResult(checked);
result->complete(static_cast<MessageConfig::StandardButton>(res));
}
void WidgetsPresenter::presentInputDialog(const MessageConfig &config, MessageResult *result)
{
}
void WidgetsPresenter::presentFileDialog(const MessageConfig &config, MessageResult *result)
{
}
void WidgetsPresenter::presentOtherDialog(const MessageConfig &config, MessageResult *result)
{
Q_UNUSED(result)
throw PresenterException(QByteArrayLiteral("Unable to find a method that is able to show a dialog of type") +
config.type());
}
// ------------- Private Implementation ------------- // ------------- Private Implementation -------------
WidgetsPresenterPrivate::WidgetsPresenterPrivate() : WidgetsPresenterPrivate::WidgetsPresenterPrivate() :

5
src/mvvmwidgets/widgetspresenter.h

@ -44,6 +44,11 @@ protected:
virtual void showForeground(QWidget *view) const; virtual void showForeground(QWidget *view) const;
virtual void presentMessageBox(const MessageConfig &config, MessageResult *result);
virtual void presentInputDialog(const MessageConfig &config, MessageResult *result);
virtual void presentFileDialog(const MessageConfig &config, MessageResult *result);
virtual void presentOtherDialog(const MessageConfig &config, MessageResult *result);
private: private:
QScopedPointer<WidgetsPresenterPrivate> d; QScopedPointer<WidgetsPresenterPrivate> d;
}; };

4
sync.profile

@ -6,3 +6,7 @@
# Force generation of camel case headers for classes inside QtDataSync namespaces # Force generation of camel case headers for classes inside QtDataSync namespaces
$publicclassregexp = "QtMvvm::(?!__helpertypes).+"; $publicclassregexp = "QtMvvm::(?!__helpertypes).+";
%classnames = (
"message.h" => "Messages"
);

Loading…
Cancel
Save