diff --git a/HttpClient.qml b/HttpClient.qml
new file mode 100644
index 0000000..802b605
--- /dev/null
+++ b/HttpClient.qml
@@ -0,0 +1,30 @@
+import QtQuick 2.0
+
+QtObject {
+ id: root
+
+ signal reply(var data)
+ signal error(string text)
+
+ function get(url) {
+ var request = new XMLHttpRequest()
+
+ request.open('GET', url)
+ request.onreadystatechange = function () {
+ if (request.readyState !== XMLHttpRequest.DONE) {
+ return
+ }
+
+ if (request.status === 200) {
+ root.reply(JSON.parse(request.responseText))
+ return
+ }
+
+ root.error(qsTr("[%1] Request error: %2").
+ arg(request.status).
+ arg(request.statusText))
+ }
+
+ request.send()
+ }
+}
diff --git a/LightsModel.qml b/LightsModel.qml
index e2d4140..4e8b1c6 100644
--- a/LightsModel.qml
+++ b/LightsModel.qml
@@ -3,6 +3,20 @@ import QtQml.Models 2.1
ListModel {
id: root
+ readonly property var httpClient: HttpClient {
+ id: httpClient
+
+ onError: {
+ root.error(text)
+ root.isLoading = false
+ }
+
+ onReply: {
+ root.populateModel(data)
+ root.isLoading = false
+ }
+ }
+
property string serviceUrl: undefined
property bool isLoading: false
@@ -11,29 +25,8 @@ ListModel {
onServiceUrlChanged: reload()
function reload() {
- var request = new XMLHttpRequest()
-
- request.open('GET', root.serviceUrl + '/static/channels.js')
- request.onreadystatechange = function () {
- if (request.readyState !== XMLHttpRequest.DONE) {
- return
- }
-
- if (request.status === 200) {
- populateModel(JSON.parse(request.responseText))
- root.isLoading = false
- return
- }
-
- root.error(qsTr("[%1] Request error: %2").
- arg(request.status).
- arg(request.statusText))
-
- root.isLoading = false
- }
-
+ root.httpClient.get(root.serviceUrl + '/static/channels.js')
root.isLoading = true
- request.send()
}
function populateModel(data) {
diff --git a/qml.qrc b/qml.qrc
index eae51c0..5c3e215 100644
--- a/qml.qrc
+++ b/qml.qrc
@@ -11,5 +11,6 @@
GradientButton.qml
lamp.png
Off.png
+ HttpClient.qml