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