Skip to content
Snippets Groups Projects
main.qml 6.04 KiB
Newer Older
akiraohgaki's avatar
akiraohgaki committed
import QtQuick 2.0
akiraohgaki's avatar
akiraohgaki committed
import QtQuick.Window 2.0
akiraohgaki's avatar
akiraohgaki committed
import QtQuick.Controls 1.1
akiraohgaki's avatar
akiraohgaki committed
import QtQuick.Dialogs 1.2
akiraohgaki's avatar
akiraohgaki committed

akiraohgaki's avatar
akiraohgaki committed
Window {
akiraohgaki's avatar
akiraohgaki committed
    id: root
    title: Qt.application.name
    width: 400
    height: 200
    minimumWidth: 400
    minimumHeight: 200
    maximumWidth: 800
    maximumHeight: 400
akiraohgaki's avatar
akiraohgaki committed

akiraohgaki's avatar
akiraohgaki committed
    MessageDialog {
        id: confirmDialog
        title: root.title
akiraohgaki's avatar
akiraohgaki committed
        icon: StandardIcon.Question
akiraohgaki's avatar
akiraohgaki committed
        text: ''
akiraohgaki's avatar
akiraohgaki committed
        informativeText: ''
akiraohgaki's avatar
akiraohgaki committed
        detailedText: ''
akiraohgaki's avatar
akiraohgaki committed
        standardButtons: StandardButton.Ok | StandardButton.Cancel
        onAccepted: xdgUrlHandler.process()
        onRejected: Qt.quit()
    }

    MessageDialog {
        id: infoDialog
        title: root.title
akiraohgaki's avatar
akiraohgaki committed
        icon: StandardIcon.Information
akiraohgaki's avatar
akiraohgaki committed
        text: ''
akiraohgaki's avatar
akiraohgaki committed
        informativeText: ''
akiraohgaki's avatar
akiraohgaki committed
        detailedText: ''
akiraohgaki's avatar
akiraohgaki committed
        standardButtons: StandardButton.Open | StandardButton.Close
        onAccepted: {
            xdgUrlHandler.openDestination();
            Qt.quit();
        }
        onRejected: Qt.quit()
akiraohgaki's avatar
akiraohgaki committed
    }

    MessageDialog {
        id: errorDialog
        title: root.title
akiraohgaki's avatar
akiraohgaki committed
        icon: StandardIcon.Warning
akiraohgaki's avatar
akiraohgaki committed
        text: ''
akiraohgaki's avatar
akiraohgaki committed
        informativeText: ''
akiraohgaki's avatar
akiraohgaki committed
        detailedText: ''
akiraohgaki's avatar
akiraohgaki committed
        standardButtons: StandardButton.Close
        onRejected: Qt.quit()
akiraohgaki's avatar
akiraohgaki committed
    }

akiraohgaki's avatar
akiraohgaki committed
    Dialog {
akiraohgaki's avatar
akiraohgaki committed
        id: progressDialog
        title: root.title
akiraohgaki's avatar
akiraohgaki committed
        contentItem: Item {
akiraohgaki's avatar
akiraohgaki committed
            implicitWidth: 400
akiraohgaki's avatar
akiraohgaki committed
            implicitHeight: 150
akiraohgaki's avatar
akiraohgaki committed
            Column {
                anchors.fill: parent
                anchors.margins: 12
                spacing: 8
                Label {
                    id: primaryLabel
                    text: ''
                    font.bold: true
                }
akiraohgaki's avatar
akiraohgaki committed
                Label {
                    id: informativeLabel
                    text: ''
                }
akiraohgaki's avatar
akiraohgaki committed
                ProgressBar {
                    id: progressBar
                    maximumValue: 1
                    minimumValue: 0
                    value: 0
                    anchors.left: parent.left
                    anchors.right: parent.right
                }
akiraohgaki's avatar
akiraohgaki committed
                Label {
                    id: progressLabel
                    text: ''
                    anchors.right: parent.right
                }
akiraohgaki's avatar
akiraohgaki committed
                Button {
                    id: cancelButton
                    text: 'Cancel'
                    anchors.right: parent.right
                    onClicked: Qt.quit()
                }
            }
akiraohgaki's avatar
akiraohgaki committed
        }
akiraohgaki's avatar
akiraohgaki committed
        property alias primaryLabel: primaryLabel
akiraohgaki's avatar
akiraohgaki committed
        property alias informativeLabel: informativeLabel
akiraohgaki's avatar
akiraohgaki committed
        property alias progressBar: progressBar
akiraohgaki's avatar
akiraohgaki committed
        property alias progressLabel: progressLabel
akiraohgaki's avatar
akiraohgaki committed
    Component.onCompleted: {
akiraohgaki's avatar
akiraohgaki committed
        var metadata = JSON.parse(xdgUrlHandler.getMetadata());
        var primaryMessages = {
            'success_download': 'Download successfull',
            'success_install': 'Installation successfull',
            'error_validation': 'Validation error',
            'error_network': 'Network error',
            'error_filetype': 'File type error',
            'error_save': 'Saving file failed',
            'error_install': 'Installation failed'
        };

        xdgUrlHandler.started.connect(function() {
            progressDialog.open();
        });
akiraohgaki's avatar
akiraohgaki committed

akiraohgaki's avatar
akiraohgaki committed
        xdgUrlHandler.finished.connect(function(result) {
            progressDialog.close();
akiraohgaki's avatar
akiraohgaki committed
            result = JSON.parse(result);
            infoDialog.text = primaryMessages[result.status];
            infoDialog.informativeText = metadata.filename;
            infoDialog.detailedText = result.message;
            infoDialog.open();
        });
akiraohgaki's avatar
akiraohgaki committed

        xdgUrlHandler.error.connect(function(result) {
            progressDialog.close();
            result = JSON.parse(result);
            errorDialog.text = primaryMessages[result.status];
            errorDialog.informativeText = metadata.filename;
            errorDialog.detailedText = result.message;
            errorDialog.open();
akiraohgaki's avatar
akiraohgaki committed
        });

        xdgUrlHandler.downloadProgress.connect(function(received, total) {
akiraohgaki's avatar
akiraohgaki committed
            progressDialog.primaryLabel.text = 'Downloading... ';
            progressDialog.informativeLabel.text = metadata.filename;
            progressDialog.progressBar.value = received / total;
            progressDialog.progressLabel.text = convertByteToHumanReadable(received)
                    + ' / ' + convertByteToHumanReadable(total)
akiraohgaki's avatar
akiraohgaki committed
        if (xdgUrlHandler.isValid()) {
akiraohgaki's avatar
akiraohgaki committed
            confirmDialog.text = 'Do you want to ' + metadata.command + '?';
            confirmDialog.informativeText = metadata.filename;
            confirmDialog.detailedText = 'URL: ' + metadata.url + '\n\n'
                    + 'File: ' + metadata.filename + '\n\n'
akiraohgaki's avatar
akiraohgaki committed
                    + 'Type: ' + metadata.type;
akiraohgaki's avatar
akiraohgaki committed
            confirmDialog.open();
        }
        else {
akiraohgaki's avatar
akiraohgaki committed
            errorDialog.text = 'Validation error';
            errorDialog.detailedText = 'Invalid XDG-URL ' + xdgUrlHandler.getXdgUrl();
akiraohgaki's avatar
akiraohgaki committed
            errorDialog.open();
        }
    }

    function convertByteToHumanReadable(bytes) {
        bytes = parseFloat(bytes);
        var kb = 1024;
        var mb = 1024 * kb;
        var gb = 1024 * mb;
        var tb = 1024 * gb;
        var pb = 1024 * tb;
        var eb = 1024 * pb;
        var zb = 1024 * eb;
        var yb = 1024 * zb;

        var text = '';
        if (bytes < kb) {
            text = bytes.toFixed(0) + ' B';
        }
        else if (bytes < mb) {
            text = (bytes / kb).toFixed(2) + ' KB';
        }
        else if (bytes < gb) {
            text = (bytes / mb).toFixed(2) + ' MB';
        }
        else if (bytes < tb) {
            text = (bytes / gb).toFixed(2) + ' GB';
        }
        else if (bytes < pb) {
            text = (bytes / tb).toFixed(2) + ' TB';
        }
        else if (bytes < eb) {
            text = (bytes / pb).toFixed(2) + ' PB';
        }
        else if (bytes < zb) {
            text = (bytes / eb).toFixed(2) + ' EB';
        }
        else if (bytes < yb) {
            text = (bytes / zb).toFixed(2) + ' ZB';
        }
        else if (bytes >= yb) {
            text = (bytes / yb).toFixed(2) + ' YB';
        }
        return text;
    }
akiraohgaki's avatar
akiraohgaki committed
}