diff --git a/mix/qml.qrc b/mix/qml.qrc
index c47a7254f..784404270 100644
--- a/mix/qml.qrc
+++ b/mix/qml.qrc
@@ -63,5 +63,6 @@
qml/js/Printer.js
qml/js/ansi2html.js
qml/js/NetworkDeployment.js
+ qml/js/InputValidator.js
diff --git a/mix/qml/QIntTypeView.qml b/mix/qml/QIntTypeView.qml
index a3c67aafc..c42e65654 100644
--- a/mix/qml/QIntTypeView.qml
+++ b/mix/qml/QIntTypeView.qml
@@ -21,8 +21,15 @@ Item
clip: true
selectByMouse: true
text: value
+ anchors.fill: parent
font.pointSize: dbgStyle.general.basicFontSize
color: dbgStyle.general.basicColor
+ MouseArea {
+ id: mouseArea
+ anchors.fill: parent
+ hoverEnabled: true
+ onClicked: textinput.forceActiveFocus()
+ }
}
}
}
diff --git a/mix/qml/TransactionDialog.qml b/mix/qml/TransactionDialog.qml
index e7fe22e51..a4c896d3f 100644
--- a/mix/qml/TransactionDialog.qml
+++ b/mix/qml/TransactionDialog.qml
@@ -6,6 +6,7 @@ import QtQuick.Window 2.0
import QtQuick.Controls.Styles 1.3
import org.ethereum.qml.QEther 1.0
import "js/TransactionHelper.js" as TransactionHelper
+import "js/InputValidator.js" as InputValidator
import "."
Dialog {
@@ -503,10 +504,22 @@ Dialog {
anchors.right: parent.right;
Button {
+
text: qsTr("OK");
onClicked: {
- close();
- accepted();
+ var invalid = InputValidator.validate(paramsModel, paramValues);
+ if (invalid.length === 0)
+ {
+ close();
+ accepted();
+ }
+ else
+ {
+ errorDialog.text = qsTr("some parameters are invalid:\n");
+ for (var k in invalid)
+ errorDialog.text += invalid[k].message + "\n";
+ errorDialog.open();
+ }
}
}
@@ -514,6 +527,12 @@ Dialog {
text: qsTr("Cancel");
onClicked: close();
}
+
+ MessageDialog {
+ id: errorDialog
+ standardButtons: StandardButton.Ok
+ icon: StandardIcon.Critical
+ }
}
}
}
diff --git a/mix/qml/js/InputValidator.js b/mix/qml/js/InputValidator.js
new file mode 100644
index 000000000..6e94dec6e
--- /dev/null
+++ b/mix/qml/js/InputValidator.js
@@ -0,0 +1,112 @@
+var nbRegEx = new RegExp('^[0-9]+$');
+function validate(model, values)
+{
+ var inError = [];
+ for (var k in model)
+ {
+ if (values[model[k].name])
+ {
+ var type = model[k].type.name;
+ var res;
+ if (type.indexOf("int") !== -1)
+ res = validateInt(type, values[model[k].name]);
+ else if (type.indexOf("bytes") !== -1)
+ res = validateBytes(type, values[model[k].name]);
+ else if (type.indexOf("bool") !== -1)
+ res = validateBool(type, values[model[k].name]);
+ else if (type.indexOf("address") !== -1)
+ res = validateAddress(type, values[model[k].name]);
+ else
+ res = validateAddress(type, values[model[k].name]); //we suppose that this is a ctr type.
+ if (!res.valid)
+ inError.push({ type: type, value: values, message: res.message });
+ }
+ }
+ return inError;
+}
+
+function validateInt(_type, _value)
+{
+ var ret = { valid: true, message: "" }
+ if (_value.indexOf("-") === 0)
+ {
+ _value = _value.substring(1);
+ if (_type.indexOf("uint") === -1)
+ {
+ ret.valid = false;
+ ret.message = "uint type cannot represent negative number";
+ return false;
+ }
+ }
+ ret.valid = nbRegEx.test(_value);
+ if (!ret.valid)
+ ret.message = _value + " does not represent " + _type + " type.";
+ else
+ {
+ var t = _type.replace("uint", "").replace("int", "");
+ var max = parseInt(t) / 4;
+ if (_value.length > max)
+ {
+ ret.valid = false;
+ ret.message = _type + " should not contains more than " + max + " digits";
+ }
+ }
+ return ret;
+}
+
+function validateAddress(_type, _value)
+{
+ var ret = { valid: true, message: "" }
+ if (_value.indexOf("<") === 0 && _value.indexOf(">") === _value.length - 1)
+ {
+ var v = _value.split(' - ');
+ console.log(JSON.stringify(v));
+ if (v.length !== 2 || !nbRegEx.test(v[1].replace(">", ""))) //
+ {
+ ret.valid = false;
+ ret.message = _value + " is not a valid token for address type.";
+ }
+ }
+ else if (_value.indexOf("0x") !== 0)
+ {
+ ret.valid = false
+ ret.message = "Address type should start with 0x.";
+ }
+ else
+ {
+ _value = _value.substring(2);
+ if (_value.length !== 40)
+ {
+ ret.valid = false
+ ret.message = "Address type should contain 40 characters.";
+ }
+ }
+ return ret;
+}
+
+function validateBytes(_type, _value)
+{
+ var ret = { valid: true, message: "" }
+ if (_value.length > parseInt(_type.replace("bytes", "")) )
+ {
+ ret.valid = false;
+ ret.message = _type + " should not contains more than " + _type.replace("bytes", "") + " characters";
+ }
+ return ret;
+}
+
+function validateBool(_type, _value)
+{
+ var ret = { valid: true, message: "" }
+ if (_value !== "1" && _value !== "0")
+ {
+ ret.valid = false;
+ ret.message = _value + " is not in the correct bool format";
+ }
+ return ret;
+}
+
+function validateEnum(_type, _value)
+{
+}
+