Системные функции

Среда AppStudio AppFramework содержит несколько компонентов, предоставляющих доступ к стандартным и хорошо известным системным функциям. Хотя для использования этих функций в вашем приложении, предлагаемые компоненты не обязательны, возможность внедрения этих компонентов должна быть учтена при планировании использования этих функций.

Буфер обмена

По умолчанию, приложение AppStudio беспрепятственно использует функции копирования в буфер обмена, вырезания и вставки из буфера обмена, и вам нет необходимости прописывать специальный код для этих функций. Для более сложного рабочего процесса с использованием буфера обмена, включая копирование специальных элементов, таких как цвета и объекты JavaScript, компонент Clipboard обеспечивает более детализированный доступ к системному буферу обмена.

Компонент Clipboard включает несколько свойств и методов для возвращения содержимого системного буфера обмена, в зависимости от типа сохраненных данных. Свойства text возвращает текстовые строки, если возможно, как простой текст, без форматирования, и, по возможности, видимый HTML, в зависимости от содержимого буфера обмена.

TextArea {
    id: textArea
                    
    Layout.fillWidth: true
    Layout.fillHeight: true
                    
    text: AppFramework.clipboard.text
    readOnly: true
}

Свойство html, в свою очередь, предназначено для чтения и отображения содержимого HTML. Это свойство также позволяет прочитать и возвратить сложное текстовое форматирование, которое в следующем примере кода используется в виде дополнения свойства к области текста, для которого включено сложное форматирование.

TextArea {
    id: htmlTextArea                        Layout.fillWidth: true    Layout.fillHeight: true                        text: AppFramework.clipboard.html    textFormat: Text.RichText    readOnly: true
}

Значения цветов хранятся как тип application/x-color MIME и могут быть записаны и возвращены в виде свойства color.

Компонент Clipboard не взаимодействует с изображениями в системном буфере обмена (хотя, в зависимости от источника, свойство text может возвратить URL). Вместо этого, компонент ImageObject обеспечивает методы copyFromClipboard и pasteFromClipboard для взаимодействия.

Flow {
    Layout.fillWidth: true                ImageObject {
        id: imageObject    }
                Button {
        text: "Clear Image"
        enabled: !imageObject.empty                        onClicked: {
            imageObject.clear();
        }
    }
                Button {
        text: "Copy"
        enabled: !imageObject.empty                        onClicked: {
            imageObject.copyToClipboard();
        }
    }
                Button {
        text: "Paste"
        enabled: imageObject.canPasteFromClipboard                        onClicked: {
            imageObject.pasteFromClipboard();
        }
    }
}

Функции совместного использования

Вы можете совместно использовать текст или URL несколькими приложениями, применяя функции, предлагающиеся в AppFramework Clipboard. У компонента Clipboard метод share используется для публикации любого вводимого текста или URL. При публикации файла для метода share нужно задать URL местоположения файла. Следующий фрагмент кода показывает, как использовать данный метод, публикуя вводимый в текстовое поле текст.

property url shareURL
TextField {
    id: inputText    placeholderText: "Enter something to share"
}
Button {
    text: "Share as text"
    onClicked: {
        AppFramework.clipboard.share(inputText.text)    }
}
Button {
    text: "Share as Url"
    onClicked: {
        shareURL = inputText.text        AppFramework.clipboard.share(shareURL)    }
}

В настоящее время данная функциональная возможность поддерживается на платформах macOS, iOS и Android.

Пример использования подобного функционала см. в примере приложения, доступном в ArcGIS AppStudio или в репозитории образцов AppStudio на GitHub.

Информация о локализации

Локализация подразумевает стандартизированную информацию, описывающую язык или диалект, включая такие элементы, как алфавит, разделитель целой и дробной части и формат отображения даты и времени. Используя корректный код локализации вы можете перезаписать локальные настройки системы по умолчанию, и использовать разнообразные способы отображения информации в вашем приложении.

Локальные коды можно вставить в приложение с помощью компонента LocaleInfo, который содержит свойства для определения локализации, и добавления локальной информации соответственно стандартам во все разделы приложения. В AppStudio, примером может служить использование LocaleInfo для определения языка диалогового окна авторизации OAuth для ArcGIS Online. Чтобы применить эту возможность, сначала необходимо создать LocaleInfo, затем добавить как исходную локальную информацию, так и измененную.

property string localeName
property string oauthUrlFormat: "https://www.arcgis.com/sharing/rest/oauth2/authorize?client_id=arcgisonline&redirect_uri=http://www.arcgis.com&response_type=token&locale=%1"
property url oauthUrl
    
Component.onCompleted: {
    // Get the current Locale from the system's locale settings
    localeName = Qt.locale().name;
}
LocaleInfo {
    id: localeInfo
    name: localeName
    //  update the properties and the OAuth page when the app Locale is changed
    onLocaleChanged: {
        localeInfoModel.update(localeInfo);
        oauthUrl = oauthUrlFormat.arg(esriName);
        if (oauthTab.item) {
            oauthTab.item.url = oauthUrl;
        }
    }
}

Чтобы обновить локальную информацию приложения добавьте текстовое поле для отображения и редактирования локальной информации.

Text {
    text: "Locale search"
}
// locale Name provided by the user for the app e.g. fr-Fr, en-GB, de_DE TextField {
    id: localeField    Layout.fillWidth: true    text: localeName    placeholderText: "Locale"
    onEditingFinished: {
        localeName = text;
    }
    function update(name) {
        text = name;
        editingFinished();
    }
}

Так как остальные свойства LocaleInfo не обновляются при синхронизации, функция будет обновлять их. Для этого рабочего процесса они могут быть представлены в виде списка, который можно отобразить в пользовательском интерфейсе.

// Model to list the properties associated with the LocaleInfo ListModel {
    id: localeInfoModel    // function to update the properties when the Locale is changed in the textbox    function update(localeInfo) {
        clear();
        add("name",                 localeInfo.name);
        add("ietfName",             localeInfo.ietfName);
        add("esriName",             localeInfo.esriName);
        add("languageName",         localeInfo.languageName);
        add("languageCode",         localeInfo.languageCode);
        add("countryName",          localeInfo.countryName);
        add("countryCode",          localeInfo.countryCode);
        add("scriptName",           localeInfo.scriptName);
        add("scriptCode",           localeInfo.scriptCode);
    }
    function add(name, value) {
        append({
            name: name,            value: value.toString()        });
    }
}

После настройки вы сможете добавить веб-вид к диалоговому окну входа OAuth, который будет отображаться в соответствии с локальными настройками, указанными в текстовом поле. В этом случае окно отображается как часть вида вкладки вместе со списком свойств LocaleInfo выше.

TabView {
    Layout.fillWidth: true    Layout.fillHeight: true
    Tab {
        id: localeInfoTab        title: "LocaleInfo"
        TableView {
            model: localeInfoModel
            TableViewColumn {
                role: "name"
                title: "Property"
            }
            TableViewColumn {
                role: "value"
                title: "Value"
            }
        }
    }
    Tab {
        id: oauthTab        title: "Sign In Page"
        WebView {
            // Load the OAuth url in the webView.            Component.onCompleted: {
                url = oauthUrl;
            }
        }
    }
}

Следует помнить, что управление локальным кодом, и изменение представления вашего приложения в зависимости от этого, являются лишь частью процесса локализации. Более подробно см. глобализация приложения.

URL

Для выполнения сложных операций с URL, компонент UrlInfo обеспечивает свойства и методы для построения и разбора URL. Они используются для динамического построения URL или выделения отдельных фрагментов пути. Следующий раздел кода показывает, как использовать UrlInfo для извлечения параметров запроса из URL, в данном примере, из сервиса объектов. Правки, внесенные в извлеченный запрос при запуске примера приложения, затем повторно собираются и представляются в виде нового URL-адреса.

Column {
    id: cl    width: parent.width    spacing: 5
    UrlInfo {
        id: urlInfo    }
    Text {
        text: "Your initial URL:"
        wrapMode: Text.WrapAnywhere        width: parent.width    }
    TextArea {
        id: urlField        selectByMouse: true        cursorPosition: 1        wrapMode: "Wrap"
        width: parent.width        font.pixelSize: 10        horizontalAlignment :TextInput.AlignLeft        text:"https://csmgisweb.smgov.net/csmgis01/rest/services/admin_boundaries/zoning/MapServer/0/query?objectIds=99,100&time=&geometry=&geometryType=esriGeometryPoint&inSR=&spatialRel=esriSpatialRelContains&f=html"
        onTextChanged: {
            urlInfo.fromUserInput(text);
        }
    }
    CheckBox {
        text: "<b>Is a query present?</b>"
        checked: urlInfo.hasQuery        enabled: false        padding: 0    }
    Text {
        text: "<b>The query for your URL</b>: "
        wrapMode: Text.WrapAnywhere        width: parent.width    }
    Text {
        text: "Edit the query, and the URL below it will update with your changes."
        wrapMode: Text.WrapAnywhere        width: parent.width    }
    TextArea {
        id: queryField        text: JSON.stringify(urlInfo.queryParameters, undefined, 2)        wrapMode: Text.WrapAnywhere        width: parent.width
        onTextChanged: {
            urlInfo.queryParameters = JSON.parse(text);
        }
    }
    Text {
        text: "<b>Your URL with updated query:<b>"
        wrapMode: Text.WrapAnywhere        width: parent.width    }
    TextField {
        id: reQueried        text: urlInfo.url        wrapMode: Text.WrapAnywhere        width: parent.width    }
}