Browse Source

added qml progress dialog

pull/2/head
Skycoder42 7 years ago
parent
commit
add9669a0f
No known key found for this signature in database GPG Key ID: 8E01AD9EF0578D2B
  1. 4
      examples/mvvmquick/SampleQuick/SampleView.qml
  2. 4
      src/imports/mvvmcore/plugins.qmltypes
  3. 36
      src/imports/mvvmquick/DialogPresenter11.qml
  4. 15
      src/imports/mvvmquick/MsgBoxBase.qml
  5. 4
      src/imports/mvvmquick/PopupPresenter11.qml
  6. 97
      src/imports/mvvmquick/ProgressDialog.qml
  7. 3
      src/imports/mvvmquick/mvvmquick.pro
  8. 1
      src/imports/mvvmquick/qmldir
  9. 2
      src/mvvmcore/message.cpp
  10. 4
      src/mvvmcore/message.h
  11. 2
      src/mvvmwidgets/widgetspresenter.cpp

4
examples/mvvmquick/SampleQuick/SampleView.qml

@ -39,6 +39,10 @@ Page {
text: qsTr("Add Color") text: qsTr("Add Color")
onTriggered: viewModel.getColor() onTriggered: viewModel.getColor()
} }
MenuItem {
text: qsTr("Show Progress")
onTriggered: viewModel.showProgress()
}
MenuSeparator {} MenuSeparator {}

4
src/imports/mvvmcore/plugins.qmltypes

@ -128,7 +128,7 @@ Module {
Signal { name: "closeRequested" } Signal { name: "closeRequested" }
Signal { Signal {
name: "canceled" name: "canceled"
Parameter { name: "btn"; type: "MessageConfig::StandardButton" } Parameter { name: "btn"; type: "QtMvvm::MessageConfig::StandardButton" }
} }
Signal { name: "closed" } Signal { name: "closed" }
Method { name: "close" } Method { name: "close" }
@ -162,7 +162,7 @@ Module {
} }
Method { Method {
name: "requestCancel" name: "requestCancel"
Parameter { name: "btn"; type: "MessageConfig::StandardButton" } Parameter { name: "btn"; type: "QtMvvm::MessageConfig::StandardButton" }
} }
Method { name: "notifyClosed" } Method { name: "notifyClosed" }
} }

36
src/imports/mvvmquick/DialogPresenter11.qml

@ -76,9 +76,11 @@ QtObject {
return createInput(config, result) return createInput(config, result)
else if(config.type == "file") else if(config.type == "file")
return createFile(config, result) return createFile(config, result)
else if(config.type == "color") { else if(config.type == "color")
return createColor(config, result) return createColor(config, result)
} else else if(config.type == "progress")
return createProgress(config, result)
else
return false; return false;
} }
@ -93,6 +95,10 @@ QtObject {
*/ */
function closeAction() { function closeAction() {
if(_popups.length > 0) { if(_popups.length > 0) {
if(typeof _popups[_popups.length - 1].closeAction == "function") {
if(_popups[_popups.length - 1].closeAction())
return true;
}
_popups[_popups.length - 1].reject(); _popups[_popups.length - 1].reject();
return true; return true;
} else } else
@ -173,6 +179,24 @@ QtObject {
} }
} }
//! Internal property
property Component _progressComponent: ProgressDialog {
id: __progress
onClosed: {
var index = _popups.indexOf(__progress);
if(index > -1) {
__progress.destroy();
_dialogPresenter._popups.splice(index, 1);
}
}
Component.onCompleted: {
_popups.push(__progress)
__progress.open()
}
}
/*! @brief Method present a dialog of the QtMvvm::MessageConfig::TypeMessageBox /*! @brief Method present a dialog of the QtMvvm::MessageConfig::TypeMessageBox
* *
* @param type:MessageConfig config The message configuration to create a dialog of * @param type:MessageConfig config The message configuration to create a dialog of
@ -243,4 +267,12 @@ QtObject {
config.subType = "QColor"; config.subType = "QColor";
return createInput(config, result); return createInput(config, result);
} }
function createProgress(config, result) {
var props = config.viewProperties;
props["msgConfig"] = config;
props["msgResult"] = result;
var incubator = _progressComponent.incubateObject(rootItem, props, Qt.Synchronous);
return incubator.status !== Component.Error;
}
} }

15
src/imports/mvvmquick/MsgBoxBase.qml

@ -2,7 +2,7 @@ import QtQuick 2.10
import QtQuick.Controls 2.3 import QtQuick.Controls 2.3
import QtQuick.Window 2.2 import QtQuick.Window 2.2
import QtQuick.Layouts 1.3 import QtQuick.Layouts 1.3
import de.skycoder42.QtMvvm.Core 1.0 import de.skycoder42.QtMvvm.Core 1.1
import de.skycoder42.QtMvvm.Quick 1.1 import de.skycoder42.QtMvvm.Quick 1.1
AlertDialog { AlertDialog {
@ -13,6 +13,9 @@ AlertDialog {
property alias iconVisible: _icon.visible property alias iconVisible: _icon.visible
property alias iconSource: _icon.source property alias iconSource: _icon.source
property bool autoHandleBtns: true
signal buttonClicked(int button)
header: Pane { header: Pane {
id: _headerPane id: _headerPane
@ -45,6 +48,7 @@ AlertDialog {
footer: DialogButtonBox { footer: DialogButtonBox {
id: _btnBox id: _btnBox
visible: msgConfig.buttons !== MessageConfig.NoButton
readonly property var _allBtns: [ readonly property var _allBtns: [
DialogButtonBox.NoButton, DialogButtonBox.NoButton,
@ -76,26 +80,27 @@ AlertDialog {
} }
onClicked: { onClicked: {
if(msgResult) { _msgBoxBase.buttonClicked(button);
if(msgResult && autoHandleBtns) {
_allBtns.forEach(function(sBtn) { _allBtns.forEach(function(sBtn) {
if(button === standardButton(sBtn)) { if(button === standardButton(sBtn)) {
msgResult.complete(sBtn); msgResult.complete(sBtn);
msgResult = null; msgResult = null;
} }
}) });
} }
} }
} }
onClosed: { onClosed: {
if(msgResult) { if(msgResult && autoHandleBtns) {
msgResult.complete(MessageConfig.NoButton); msgResult.complete(MessageConfig.NoButton);
msgResult = null; msgResult = null;
} }
} }
Component.onCompleted: { Component.onCompleted: {
if(msgResult) if(msgResult && autoHandleBtns)
msgResult.setCloseTarget(_msgBoxBase, "reject()"); msgResult.setCloseTarget(_msgBoxBase, "reject()");
} }
} }

4
src/imports/mvvmquick/PopupPresenter11.qml

@ -95,6 +95,10 @@ QtObject {
*/ */
function closeAction() { function closeAction() {
if(_popups.length > 0) { if(_popups.length > 0) {
if(typeof _popups[_popups.length - 1].closeAction == "function") {
if(_popups[_popups.length - 1].closeAction())
return true;
}
_popups[_popups.length - 1].close(); _popups[_popups.length - 1].close();
return true; return true;
} else } else

97
src/imports/mvvmquick/ProgressDialog.qml

@ -0,0 +1,97 @@
import QtQuick 2.10
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.3
import de.skycoder42.QtMvvm.Core 1.1
import de.skycoder42.QtMvvm.Quick 1.1
MsgBoxBase {
id: _progressDialog
closePolicy: Popup.NoAutoClose
autoHandleBtns: false
readonly property ProgressControl progressControl: msgConfig.defaultValue
property string format: "%p%"
property int _cancelAction: MessageConfig.NoButton
readonly property bool _allowClose: !progressControl || !msgResult
onButtonClicked: tryCancel(button)
onAboutToHide: { //TODO find a way to NOT auto react on button presses... better that this solution
var closeFn = function(){
if(!_allowClose)
_progressDialog.visible = true;
};
if(QuickPresenter.currentStyle == "Material")
Qt.callLater(closeFn);
else
closeFn();
}
Component.onCompleted: {
if(msgResult)
msgResult.setCloseTarget(_progressDialog, "finish()");
}
function finish() {
msgResult.complete(_cancelAction);
msgResult = null;
close();
}
function tryCancel(button) {
if(_cancelAction == MessageConfig.NoButton) {
_cancelAction = button;
footer.enabled = false;
if(progressControl)
progressControl.requestCancel(button);
else
finish();
}
}
function closeAction() {
tryCancel(MessageConfig.Cancel);
return true;
}
Connections {
target: progressControl
onChangeLabel: _contentLabel.text = text;
onCloseRequested: finish()
}
GridLayout {
columns: 2
anchors.fill: parent
Label {
id: _contentLabel
text: msgConfig.text.replace(/<\/p>/g, "</p><br/>") //needed because qml does not put space between paragraphs...
visible: text != ""
Layout.fillWidth: true
Layout.columnSpan: 2
wrapMode: Text.Wrap
onLinkActivated: Qt.openUrlExternally(link)
}
ProgressBar {
id: _loadProgress
Layout.fillWidth: true
Layout.columnSpan: progressControl.indeterminate ? 2 : 1
indeterminate: progressControl.indeterminate
from: progressControl.minimum
to: progressControl.maximum
value: progressControl.progress
}
Label {
id: _progressLabel
visible: !progressControl.indeterminate
text: format
.replace("%p", Math.round(((progressControl.progress - progressControl.minimum) / (progressControl.maximum - progressControl.minimum)) * 100.0))
.replace("%v", progressControl.progress)
.replace("%m", progressControl.maximum - progressControl.minimum)
}
}
}

3
src/imports/mvvmquick/mvvmquick.pro

@ -59,7 +59,8 @@ QML_FILES += \
TimeEdit.qml \ TimeEdit.qml \
DateEdit.qml \ DateEdit.qml \
ColorHelper.qml \ ColorHelper.qml \
ColorEdit.qml ColorEdit.qml \
ProgressDialog.qml
RESOURCES += \ RESOURCES += \
qtmvvmquick_plugin.qrc qtmvvmquick_plugin.qrc

1
src/imports/mvvmquick/qmldir

@ -10,6 +10,7 @@ depends de.skycoder42.QtMvvm.Core 1.0
internal MsgBoxBase MsgBoxBase.qml internal MsgBoxBase MsgBoxBase.qml
internal MsgBox MsgBox.qml internal MsgBox MsgBox.qml
internal InputDialog InputDialog.qml internal InputDialog InputDialog.qml
internal ProgressDialog ProgressDialog.qml
internal ListSection ListSection.qml internal ListSection ListSection.qml
internal SectionListView SectionListView.qml internal SectionListView SectionListView.qml

2
src/mvvmcore/message.cpp

@ -739,7 +739,7 @@ MessageResult *QtMvvm::showProgress(const QString &title, const QString &label,
MessageConfig config(MessageConfig::TypeProgressDialog, isBusy ? MessageConfig::SubTypeBusy : MessageConfig::SubTypeProgress); MessageConfig config(MessageConfig::TypeProgressDialog, isBusy ? MessageConfig::SubTypeBusy : MessageConfig::SubTypeProgress);
config.setTitle(title); config.setTitle(title);
config.setText(label); config.setText(label);
config.setDefaultValue(QVariant::fromValue<QPointer<ProgressControl>>(control)); config.setDefaultValue(QVariant::fromValue(control));
config.setButtons(allowCancel ? MessageConfig::Cancel : MessageConfig::NoButton); config.setButtons(allowCancel ? MessageConfig::Cancel : MessageConfig::NoButton);
return CoreApp::showDialog(config); return CoreApp::showDialog(config);
} }

4
src/mvvmcore/message.h

@ -263,7 +263,7 @@ public:
int maximum() const; int maximum() const;
int progress() const; int progress() const;
Q_INVOKABLE void requestCancel(MessageConfig::StandardButton btn); Q_INVOKABLE void requestCancel(QtMvvm::MessageConfig::StandardButton btn);
Q_INVOKABLE void notifyClosed(); Q_INVOKABLE void notifyClosed();
public Q_SLOTS: public Q_SLOTS:
@ -287,7 +287,7 @@ Q_SIGNALS:
void changeLabel(const QString &text, QPrivateSignal); void changeLabel(const QString &text, QPrivateSignal);
void closeRequested(QPrivateSignal); void closeRequested(QPrivateSignal);
void canceled(MessageConfig::StandardButton btn, QPrivateSignal); void canceled(QtMvvm::MessageConfig::StandardButton btn, QPrivateSignal);
void closed(QPrivateSignal); void closed(QPrivateSignal);
private: private:

2
src/mvvmwidgets/widgetspresenter.cpp

@ -482,7 +482,7 @@ void WidgetsPresenter::presentColorDialog(const MessageConfig &config, const QPo
void WidgetsPresenter::presentProgressDialog(const MessageConfig &config, const QPointer<MessageResult> &result) void WidgetsPresenter::presentProgressDialog(const MessageConfig &config, const QPointer<MessageResult> &result)
{ {
auto control = config.defaultValue().value<QPointer<ProgressControl>>(); auto control = config.defaultValue().value<ProgressControl*>();
if(!control) { if(!control) {
logWarning() << "ProgressControl was destroyed before a progress dialog could be shown"; logWarning() << "ProgressControl was destroyed before a progress dialog could be shown";
return; return;

Loading…
Cancel
Save