Moduł AppFramework aplikacji AppStudio zawiera kilka składników umożliwiających dostęp do standardowych i dobrze znanych funkcji systemowych. Chociaż użycie tych funkcji w aplikacji nie wymaga stosowania wspomnianych komponentów, należy jednak rozważyć ich zaimplementowanie, gdy myślimy o korzystaniu z tych funkcji.
Schowek
Domyślnie aplikacja AppStudio ma dostęp do funkcji wycinania, kopiowania i wklejania przy użyciu schowka systemowego i jeśli taki jest cel użytkownika, nie musi on pisać żadnego kodu. W przypadku bardziej złożonych procedur wykonywania zadań wykorzystujących schowek, w tym kopiowania elementów (takich jak kolory i obiekty JavaScript), komponent Clipboard zapewnia bardziej szczegółowy dostęp do schowka systemowego.
Komponent Clipboard zawiera wiele właściwości i metod umożliwiających zwrócenie zawartości schowka w zależności od typu przechowywanych w nim danych. Właściwość text zwraca zawartość w postaci ciągu znakowego zwykłego tekstu (jeśli to możliwe) bez formatowania i potencjalnie bez widocznego kodu HTML, w zależności od zawartości schowka.
TextArea {
id: textArea
Layout.fillWidth: true
Layout.fillHeight: true
text: AppFramework.clipboard.text
readOnly: true
}
Z drugiej strony właściwość html jest przeznaczona głównie do odczytu i wyświetlania treści HTML. Za pomocą tej właściwości można także odczytywać i zapisywać tekst o bardziej złożonym formacie, co zostało wykorzystane w poniższym przykładowym kodzie, w którym właściwość została zastosowana dla obszaru tekstu z włączonym formatem RTF.
TextArea {
id: htmlTextArea Layout.fillWidth: true Layout.fillHeight: true text: AppFramework.clipboard.html textFormat: Text.RichText readOnly: true
}
Wartości kolorów są przechowywane jako typ MIME (application/x-color) i mogą być zapisywane lub zwracane wyłącznie przez właściwość color.
Komponent Clipboard nie może prowadzić interakcji z obrazami w schowku systemowym (chociaż, w zależności od źródła, właściwość text może zwracać adres URL). Zamiast tego, do obsługi tej interakcji komponent ImageObject udostępnia metody copyFromClipboard i 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();
}
}
}
Funkcja udostępniania
Tekst, adresy URL i pliki mogą być udostępniane innym aplikacjom przy użyciu funkcji udostępniania oferowanej przez schowek modułu AppFramework. Metoda share komponentu schowka jest używana do udostępniania dowolnego wejściowego tekstu lub adresu URL. Gdy plik jest udostępniany, metoda share wymaga podania adresu URL lokalizacji pliku. Poniższy fragment kodu przedstawia sposób użycia tej metody w celu udostępnienia tekstu wprowadzonego w polu tekstowym.
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) }
}
Aktualnie ta funkcjonalność jest obsługiwana tylko na platformach macOS, iOS i Android.
Jako ilustracja użycia tej funkcjonalności może służyć przykładowa aplikacja dostępna w aplikacji ArcGIS AppStudio lub w repozytorium GitHub udostępniającym przykładowe rozwiązania dla aplikacji AppStudio.
Informacje o ustawieniach regionalnych
Ustawienia regionalne to standaryzowana wartość opisująca język lub dialekt, w tym szczegóły, takie jak używany alfabet, znaczniki dziesiętne i format daty. Przy użyciu poprawnego kodu ustawień regionalnych można zastąpić domyślne ustawienia regionalne systemu i umożliwić wyświetlanie informacji w aplikacji na wiele sposobów.
Te ustawienia regionalne można przekazać do aplikacji za pośrednictwem komponentu LocaleInfo, który zawiera właściwości służące do definiowania ustawień regionalnych, jak również do odwzorowywania ustawień regionalnych w jednolity sposób w standardach i innych sekcjach aplikacji. W aplikacji AppStudio przykładem tego może być użycie komponentu LocaleInfo do określenia języka okna dialogowego logowania OAuth do usługi ArcGIS Online. W tym celu należy najpierw zainicjować komponent LocaleInfo i przekazać mu informacje o początkowych ustawieniach regionalnych i dacie ich zmiany.
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;
}
}
}
Aby zaktualizować ustawienia regionalne aplikacji, należy dodać pole tekstowe dla wyświetlania i edycji ustawień regionalnych.
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();
}
}
Ponieważ inne właściwości komponentu LocaleInfo nie będą aktualizowane podczas synchronizacji, do ich aktualizacji potrzebna jest funkcja. Na potrzeby tej procedury wykonywania zadań funkcja ta znajdzie się też w modelu listy, który można udostępnić w interfejsie użytkownika.
// 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() });
}
}
Po dokonaniu konfiguracji modelu listy można dodać widok internetowy do logowania OAuth, który będzie wyświetlany w ustawieniach regionalnych zadeklarowanych we wcześniejszym polu tekstowym. W tym przypadku widok internetowy jest wyświetlany jako część widoku karty obok powyższej listy właściwości 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;
}
}
}
}
Należy zdawać sobie sprawę, że zarządzanie kodem ustawień regionalnych i uzależniona od tego kodu zmiana prezentacji aplikacji stanowią tylko część procesu lokalizacji. Więcej informacji zawiera sekcja Globalizacja aplikacji.
Adresy URL
Aby można było wykonywać złożone operacje na adresach URL, komponent UrlInfo udostępnia właściwości i metody służące do konstruowania i dekonstruowania adresów URL. Tych właściwości i metod można używać do dynamicznego konstruowania adresu URL lub uzyskiwania poszczególnych jego komponentów. W poniższej sekcji kodu przedstawiono użycie UrlInfo do wyodrębnienia parametrów zapytania z adresu URL, w tym przypadku usługi obiektowej. Zmiany wprowadzane do wyodrębnionego zapytania podczas działania przykładowej aplikacji są następnie ponownie łączone i prezentowane jako nowy adres 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 }
}