Funciones de sistema

El AppFramework de AppStudio contiene varios componentes que ofrecen acceso a funciones de sistema estándar y reconocidas. Aunque estos componentes no son necesarios para utilizar estas funciones en su aplicación, debería plantearse su implementación si planea utilizar estas funciones.

Portapapeles

Por defecto, no hay nada que impida a una aplicación de AppStudio acceder a las funciones de cortar, copiar y pegar del portapapeles del sistema; tampoco tiene que escribir ningún tipo de código si esa es su intención. Para flujos de trabajo más complejos que requieran el portapapeles, incluida la copia de elementos tales como colores y objetos de JavaScript, el componente Clipboard ofrece un acceso más detallado al portapapeles del sistema.

El componente Clipboard contiene múltiples propiedades y métodos para devolver el contenido del portapapeles del sistema, en función del tipo de datos almacenados en él. La propiedad text devuelve los contenidos como cadena de texto plano si es posible, sin formatear y potencialmente con HTML visible, en función del contenido del portapapeles.

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

La propiedad html, sin embargo, está principalmente prevista para leer y mostrar contenido HTML. Esta propiedad también puede leer y retener formato de texto más complejo; la siguiente muestra de código lo utiliza adjuntando la propiedad a un área de texto con el formato de texto enriquecido activado.

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

Los valores de color se almacenan como aplicación/x-color de tipo MIME y únicamente se pueden escribir o devolver por la propiedad color.

El componente Clipboard no tiene forma alguna de interactuar con imágenes en el portapapeles del sistema (aunque, en función de la fuente, la propiedad text puede devolver una URL). En su lugar, el componente ImageObject proporciona los métodos copyFromClipboard y pasteFromClipboard para la interacción.

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();
        }
    }
}

Compartir funcionalidades

Puede compartir texto, URL o archivos con otras aplicaciones mediante la funcionalidad de uso compartido suministrada por el Portapapeles de AppFramework. El método share del componente del Portapapeles se utiliza para compartir cualquier URL y texto de entrada. Si comparte un archivo, el método share requiere que se proporcione la URL de ubicación del archivo. El siguiente fragmento de código muestra cómo utilizar este método, compartiendo el texto introducido en un campo de texto.

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)    }
}

Actualmente, esta funcionalidad solamente es compatible con plataformas macOS, iOS y Android.

Como ejemplo de esta funcionalidad, consulte la aplicación de muestra disponible en ArcGIS AppStudio o en el repositorio de GitHub de muestras de AppStudio.

Información de configuración regional

Una configuración regional es un valor estandarizado que describe un idioma o un dialecto, incluidos detalles tales como el alfabeto utilizado, los marcadores decimales y el formato de fecha. Al utilizar un código de configuración regional válido, usted puede sobrescribir la configuración regional predeterminada de su sistema, y proporcionar diversas formas importantes en las que se mostrará la información en su aplicación.

Estas configuraciones regionales se pueden pasar a la aplicación a través del componente LocaleInfo, que contiene las propiedades para definir una configuración regional, así como para distribuir la configuración regional de forma uniforme en estándares y otras secciones de su aplicación. En AppStudio, un ejemplo sería utilizar LocaleInfo para determinar el idioma de un cuadro de diálogo de inicio de sesión de OAuth para ArcGIS Online. Para lograrlo, primero cree una instancia de LocaleInfo y proporcione información tanto de la configuración regional inicial como del momento en el que cambie la configuración regional.

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;
        }
    }
}

Para actualizar la configuración regional de la aplicación, agregue un campo de texto para mostrar y editar la configuración regional.

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();
    }
}

Ya que el resto de propiedades de LocaleInfo no se actualizarán durante la sincronización, se necesita una función para actualizarlos. A efectos de este flujo de trabajo, la función también será un modelo de lista que se puede mostrar en la UI.

// 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()        });
    }
}

Una vez configurado el modelo de lista, puede agregar una vista web de un inicio de sesión de OAuth, que mostrará la configuración regional reflejada en el campo de texto anterior. En este caso, la vista web aparece como parte de una vista de pestaña en la lista de propiedades LocaleInfo anterior.

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;
            }
        }
    }
}

Recuerde que el control del código de configuración regional y la modificación de la presentación de su aplicación que dependa de este código son solo parte del proceso de localización. Para obtener más información, consulte Globalizar su aplicación.

Direcciones URL

Para realizar operaciones complejas con URL, el componente UrlInfo ofrece propiedades y métodos para construir y deconstruir URL. Estas propiedades y métodos se pueden utilizar para construir dinámicamente una URL o para derivar componentes individuales de una. La siguiente sección de código muestra cómo utilizar UrlInfo para extraer los parámetros de una consulta de una URL, en este caso, un servicio de entidades. Las ediciones realizadas a la consulta extraída cuando la aplicación de muestra se está ejecutando se vuelven a ensamblar y se presentan como una URL nueva.

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    }
}