Skip to content
Snippets Groups Projects
main.qml 5.36 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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.1
    
    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: ''
    
            standardButtons: StandardButton.Ok
    
    akiraohgaki's avatar
    akiraohgaki committed
            onAccepted: Qt.quit()
        }
    
        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: ''
    
            standardButtons: StandardButton.Ok
    
    akiraohgaki's avatar
    akiraohgaki committed
            onAccepted: Qt.quit()
    
    akiraohgaki's avatar
    akiraohgaki committed
        }
    
    
    akiraohgaki's avatar
    akiraohgaki committed
        MessageDialog {
    
    akiraohgaki's avatar
    akiraohgaki committed
            // We maybe use generic Dialog component for
            // this dialog if we drop Qt 5.2 support
    
    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: 100
                Column {
                    anchors.fill: parent
                    anchors.margins: 12
                    spacing: 8
                    Label {
                        id: primaryLabel
                        text: ''
                        font.bold: true
                    }
                    ProgressBar {
                        id: progressBar
                        maximumValue: 1
                        minimumValue: 0
                        value: 0
                        anchors.left: parent.left
                        anchors.right: parent.right
                    }
                    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
            property alias progressBar: progressBar
    
    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) {
                console.log([received, 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
    }