Browse Source

added basic messagebox presenting

pull/2/head
Skycoder42 7 years ago
parent
commit
8e5eb5d048
  1. 8
      examples/mvvmcore/SampleCore/sampleviewmodel.cpp
  2. 7
      src/mvvmcore/coreapp.cpp
  3. 2
      src/mvvmcore/coreapp_p.h
  4. 63
      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

8
examples/mvvmcore/SampleCore/sampleviewmodel.cpp

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

7
src/mvvmcore/coreapp.cpp

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

2
src/mvvmcore/coreapp_p.h

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

63
src/mvvmcore/message.cpp

@ -191,24 +191,9 @@ void MessageResult::setCloseTarget(QObject *closeObject, const QMetaMethod &clos
d->closeMethod.invoke(d->closeObject, Qt::QueuedConnection);
}
void MessageResult::complete(MessageResult::ResultType result)
{
switch (result) {
case PositiveResult:
emit positiveAction();
break;
case NegativeResult:
emit negativeAction();
break;
case NeutralResult:
emit neutralAction();
break;
default:
Q_UNREACHABLE();
}
emit anyAction(result);
void MessageResult::complete(MessageConfig::StandardButton result)
{
emit dialogDone(result);
if(d->autoDelete)
deleteLater();
}
@ -286,7 +271,7 @@ void QtMvvm::information(const QString &title, const QString &text, QObject *sco
{
auto result = information(title, text, okText);
if(result) {
QObject::connect(result, &MessageResult::anyAction,
QObject::connect(result, &MessageResult::dialogDone,
scope, onResult,
Qt::QueuedConnection);
}
@ -313,9 +298,9 @@ void QtMvvm::question(const QString &title, const QString &text, QObject *scope,
{
auto result = question(title, text, yesText, noText);
if(result) {
QObject::connect(result, &MessageResult::anyAction,
scope, [onResult](MessageResult::ResultType type) {
onResult(type == MessageResult::PositiveResult);
QObject::connect(result, &MessageResult::dialogDone,
scope, [onResult](MessageConfig::StandardButton type) {
onResult(type == MessageConfig::Yes);
}, Qt::QueuedConnection);
}
}
@ -339,7 +324,7 @@ void QtMvvm::warning(const QString &title, const QString &text, QObject *scope,
{
auto result = warning(title, text, okText);
if(result) {
QObject::connect(result, &MessageResult::anyAction,
QObject::connect(result, &MessageResult::dialogDone,
scope, onResult,
Qt::QueuedConnection);
}
@ -364,7 +349,7 @@ void QtMvvm::critical(const QString &title, const QString &text, QObject *scope,
{
auto result = critical(title, text, okText);
if(result) {
QObject::connect(result, &MessageResult::anyAction,
QObject::connect(result, &MessageResult::dialogDone,
scope, onResult,
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);
if(result) {
QObject::connect(result, &MessageResult::anyAction,
scope, [onResult, result](MessageResult::ResultType type) {
onResult(type == MessageResult::PositiveResult ? result->result() : QVariant());
QObject::connect(result, &MessageResult::dialogDone,
scope, [onResult, result](MessageConfig::StandardButton type) {
onResult(type == MessageConfig::Ok ? result->result() : QVariant());
}, Qt::QueuedConnection);
}
}
@ -487,9 +472,9 @@ void QtMvvm::getExistingDirectory(QObject *scope, std::function<void (QUrl)> onR
{
auto result = getExistingDirectory(title, dir);
if(result) {
QObject::connect(result, &MessageResult::anyAction,
scope, [onResult, result](MessageResult::ResultType type) {
onResult(type == MessageResult::PositiveResult ? result->result().toUrl() : QUrl());
QObject::connect(result, &MessageResult::dialogDone,
scope, [onResult, result](MessageConfig::StandardButton type) {
onResult(type == MessageConfig::Ok ? result->result().toUrl() : QUrl());
}, Qt::QueuedConnection);
}
}
@ -512,9 +497,9 @@ void QtMvvm::getOpenFile(QObject *scope, std::function<void (QUrl)> onResult, co
{
auto result = getOpenFile(title, supportedMimeTypes, dir);
if(result) {
QObject::connect(result, &MessageResult::anyAction,
scope, [onResult, result](MessageResult::ResultType type) {
onResult(type == MessageResult::PositiveResult ? result->result().toUrl() : QUrl());
QObject::connect(result, &MessageResult::dialogDone,
scope, [onResult, result](MessageConfig::StandardButton type) {
onResult(type == MessageConfig::Ok ? result->result().toUrl() : QUrl());
}, Qt::QueuedConnection);
}
}
@ -537,9 +522,9 @@ void QtMvvm::getOpenFiles(QObject *scope, std::function<void (QList<QUrl>)> onRe
{
auto result = getOpenFiles(title, supportedMimeTypes, dir);
if(result) {
QObject::connect(result, &MessageResult::anyAction,
scope, [onResult, result](MessageResult::ResultType type) {
onResult(type == MessageResult::PositiveResult ? result->result().value<QList<QUrl>>() : QList<QUrl>());
QObject::connect(result, &MessageResult::dialogDone,
scope, [onResult, result](MessageConfig::StandardButton type) {
onResult(type == MessageConfig::Ok ? result->result().value<QList<QUrl>>() : QList<QUrl>());
}, Qt::QueuedConnection);
}
}
@ -562,9 +547,9 @@ void QtMvvm::getSaveFile(QObject *scope, std::function<void (QUrl)> onResult, co
{
auto result = getSaveFile(title, supportedMimeTypes, dir);
if(result) {
QObject::connect(result, &MessageResult::anyAction,
scope, [onResult, result](MessageResult::ResultType type) {
onResult(type == MessageResult::PositiveResult ? result->result().toUrl() : QUrl());
QObject::connect(result, &MessageResult::dialogDone,
scope, [onResult, result](MessageConfig::StandardButton type) {
onResult(type == MessageConfig::Ok ? result->result().toUrl() : QUrl());
}, 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)
public:
enum ResultType {
PositiveResult,
NegativeResult,
NeutralResult
};
Q_ENUM(ResultType)
explicit MessageResult();
~MessageResult();
@ -131,8 +124,8 @@ public:
//USE IN GUI ONLY
//TODO USE IN GUI ONLY in doc
Q_INVOKABLE void setCloseTarget(QObject *closeObject, const QMetaMethod &closeMethod);
Q_INVOKABLE void complete(MessageResult::ResultType result);
Q_INVOKABLE inline void complete(MessageResult::ResultType result, const QVariant &resultValue) {
Q_INVOKABLE void complete(QtMvvm::MessageConfig::StandardButton result);
Q_INVOKABLE inline void complete(QtMvvm::MessageConfig::StandardButton result, const QVariant &resultValue) {
setResult(resultValue);
complete(result);
}
@ -144,10 +137,7 @@ public Q_SLOTS:
void setAutoDelete(bool autoDelete);
Q_SIGNALS:
void positiveAction();
void negativeAction();
void neutralAction();
void anyAction(ResultType result);
void dialogDone(QtMvvm::MessageConfig::StandardButton result);
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::StandardButton)
Q_DECLARE_TYPEINFO(QtMvvm::MessageConfig, Q_MOVABLE_TYPE);
Q_DECLARE_METATYPE(QtMvvm::MessageResult*)
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,
Q_ARG(const QMetaObject*, metaObject),
Q_ARG(const QVariantHash&, params),
Q_ARG(QVariantHash, params),
Q_ARG(QPointer<ViewModel>, parent),
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": {
"file": "",
"name": ""

78
src/mvvmwidgets/widgetspresenter.cpp

@ -10,8 +10,11 @@
#include <QtWidgets/QDockWidget>
#include <QtWidgets/QMdiSubWindow>
#include <QtWidgets/QMdiArea>
#include <QtWidgets/QMessageBox>
#include <QtWidgets/QApplication>
#include <dialogmaster.h>
using namespace QtMvvm;
WidgetsPresenter::WidgetsPresenter(QObject *parent) :
@ -79,7 +82,14 @@ void WidgetsPresenter::present(ViewModel *viewModel, const QVariantHash &params,
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)
@ -170,6 +180,72 @@ void WidgetsPresenter::showForeground(QWidget *view) const
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 -------------
WidgetsPresenterPrivate::WidgetsPresenterPrivate() :

5
src/mvvmwidgets/widgetspresenter.h

@ -44,6 +44,11 @@ protected:
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:
QScopedPointer<WidgetsPresenterPrivate> d;
};

4
sync.profile

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

Loading…
Cancel
Save