aboutsummaryrefslogtreecommitdiff
path: root/src/qml/pages/QuantityPage.qml
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/pages/QuantityPage.qml')
-rw-r--r--src/qml/pages/QuantityPage.qml136
1 files changed, 136 insertions, 0 deletions
diff --git a/src/qml/pages/QuantityPage.qml b/src/qml/pages/QuantityPage.qml
new file mode 100644
index 0000000..0d5c4de
--- /dev/null
+++ b/src/qml/pages/QuantityPage.qml
@@ -0,0 +1,136 @@
+import QtQuick 2.0
+import Sailfish.Silica 1.0
+import "helpers.js" as Helpers
+
+Page {
+ id: page
+
+ property string modelFilename
+ property string quantityName
+
+ function formatText(value, unit) {
+ return "%1 %2".arg(value.toPrecision(5)).arg(pluralize(unit, value));
+ }
+
+ function updateResult() {
+ var f = parseFloat(fromField.text);
+
+ if (fromField.text.length === 0) {
+ f = 0.0;
+ }
+
+ if (fromCombo.value.length === 0 || toCombo.value.length === 0)
+ return;
+
+ var model = modelLoader.item;
+
+ var fromUnit = model.get(fromCombo.currentIndex).title;
+ var toUnit = model.get(toCombo.currentIndex).title;
+
+ var result = model.from(fromUnit, f);
+ result = model.to(toUnit, result);
+
+ resultLabel.text = formatText(result, toUnit);
+ }
+
+ function pluralize(s, n) {
+ if (n !== 1) {
+ if (s === "inch") {
+ return "inches";
+ } else if (s === "foot") {
+ return "feet";
+ } else if (s === "celcius") {
+ return s;
+ }
+ return s + "s";
+ }
+
+ return s;
+ }
+
+ function makeTitle(title, abbr) {
+ if (abbr.length > 0) {
+ return "%1 (%2)".arg(title).arg(abbr);
+ }
+
+ return title;
+ }
+
+ Component.onCompleted: {
+ modelLoader.setSource(modelFilename);
+ }
+
+ Loader {
+ id: modelLoader
+ onLoaded: {
+ fromRepeater.model = modelLoader.item;
+ toRepeater.model = modelLoader.item;
+ }
+ }
+
+ Column {
+ id: column
+ spacing: Theme.paddingLarge
+ anchors.fill: parent
+
+ PageHeader {
+ title: Helpers.capitalize(page.quantityName)
+ }
+
+ ComboBox {
+ id: fromCombo
+ width: parent.width
+ label: "From"
+ menu: ContextMenu {
+ Repeater {
+ id: fromRepeater
+ delegate: MenuItem {
+ text: makeTitle(title, abbr)
+ }
+ }
+ }
+ onValueChanged: updateResult()
+ }
+
+ TextField {
+ id: fromField
+ width: parent.width
+ placeholderText: "enter " + pluralize(fromRepeater.model.get(fromCombo.currentIndex).title, 0)
+ inputMethodHints: Qt.ImhFormattedNumbersOnly
+ EnterKey.onClicked: {
+ parent.focus = true;
+ updateResult();
+ }
+ onTextChanged: {
+ updateResult();
+ }
+ }
+
+ ComboBox {
+ id: toCombo
+ width: parent.width
+ label: "To"
+ menu: ContextMenu {
+ Repeater {
+ id: toRepeater
+ delegate: MenuItem {
+ text: makeTitle(title, abbr)
+ }
+ }
+ }
+ onValueChanged: updateResult()
+ }
+
+ SectionHeader {
+ text: "Result"
+ }
+
+ Label {
+ id: resultLabel
+ height: Theme.itemSizeSmall
+ anchors.horizontalCenter: parent.horizontalCenter
+ }
+ }
+}
+
+