Learn what Felgo offers to help your business succeed. Start your free evaluation today! Felgo for Your Business

Felgo 3 Releases

Felgo 3 Update Changelog

Use Felgo 3 to create cross-platform apps and games powered by Qt 5.15. You can find the installer for Felgo 3 in the archive section of the download page.

Note: Felgo 4 is already available and the recommended version for app development with all the latest feature of Qt 6. Future updates to Felgo will focus on Felgo 4. However, important features and fixes will also be made available for Felgo 3 to maintain support for Qt 5 and existing projects.

List of Felgo 3 Releases

v 3.11.0 (2023-10-12)

Highlights Blog Post: Release 3.11.0: Speech-to-Text, PDF Preview Images, Network Service Discovery and Felgo Live Server Search

Felgo 3.11.0 adds Speech-to-Text capabilities, an image provider to preview PDFs, network service discovery with ZeroConf and the ability to search the Felgo Hot Reload log output.

Felgo 3.11.0 comes as a free update for all Felgo developers.

Update Now (New to Felgo? Get started here)

Highlights

  • You can use the new SpeechToText item to record and transcribe spoken text online or on-device on Android and iOS.
  • You can now use Bonjour/ZeroConf network service discovery on macOS, iOS and Android. Use the new method ZeroConf::startNetworkServiceDiscovery() with the signal ZeroConf::networkServiceDiscovered().
  • Search the Felgo Hot Reload log output with a search string to find specific log messages. You can search case-sensitive, case-insensitive, or use regular expressions. Press CTRL-F to open the search panel.

New Features

Improvements

Fixes

  • Fixes the NativeUtils::galleryPhotos when targetting Android 13+ (SDK 33). This also fixes the ImagePicker not showing any pictures.
  • Fixes incorrect AppToolTip position when using long bubble texts.
  • Fixes missing placeholder text when canceling AppTextEdit input on iOS with an empty field.
  • The Notification Plugin and Chartboost Plugin now support Android 12+ (API level 31+) devices and build targets.
  • The NativeUtils::share functionality for iOS and Android is updated to properly support sharing text, web links or files with the native share dialog of the latest OS versions.
  • Fixes behavior problems when combining the PullToRefreshHandler with a ListView that has additional top spacing from a header item or top margin configuration.

v 3.10.0 (2022-07-14)

Highlights Blog Post: Release 3.10.0: Native Support for NFC Tags, Network Connection Type & Inline AdMob Banners, Qt Creator 7.0.2

Felgo 3.10.0 adds new native features to read NFC messages in NDEF format, access the network connectivity type on iOS & Android or display a native file picker. It also includes a new AdMob type to show banner ads inline with other QML elements.

Felgo 3.10.0 comes as a free update for all Felgo developers.

Update Now (New to Felgo? Get started here)

Felgo 3.10.0 Migration Hints

  • Android SDK Update to API 31

    Starting August 2022, API level 31 or above is required to publish applications on the Google Play Store. Make sure to update your Android build configuration to use the latest recommended settings and get support for Android 12 (API level 31). To do so, open the Qt Creator Android device settings and install all the suggested packages:

    Qt Creator will ask you to add the necessary components and automatically download the required packages upon your approval. You can also manually install the packages with the Android SDK Manager. To support Android 12, install the Android SDK Platform 31, as well as Android build tools version 31.0.0. When you build a project, it will automatically default to the highest installed Android SDK and build tools version.

  • The latest Android settings also require you to use Java 11 instead of Java 8. You can download the Java Development Kit 11 here.
  • In your android/build.gradle configuration, update to Android Gradle plugin 7.2.0 or higher:
     buildscript {
         dependencies {
             // UPDATE THIS:
             classpath 'com.android.tools.build:gradle:7.2.0'
         }
     }
  • Add the android:exported flag to your android/AndroidManifest.xml configuration:
     <activity ... android:exported="true">
  • Clean the build directory & rebuild the project to make sure the configuration changes are loaded as expected.
  • Migration tip for existing projects: If you want to make sure your project does not miss any important configuration, you can use the Felgo project wizard to create a clean application for reference.

Highlights

  • NFC on Android and iOS: The new NativeUtils::startNfcNdefSession() method allows to read in NDEF message formatted NFC tags as a lightweight alternative to QtNFC for Android and iOS.

  • The new AdMobBannerNative type allows embedding an ad banner directly into your QML UI.

New Features

  • The new NativeUtils::connectionType property tells about the current network connectivity (cellular, wifi or none) on Android and iOS.

  • The Felgo debug menu bar now includes an option to simulate changing the App::isOnline property (this does not set a device offline, just changes the return value of the isOnline property):

  • The Felgo debug menu bar includes new options for predefined device resolutions.
  • You can now request to delete the Firebase User that is currently logged in with the FirebaseAuth::deleteUser() method.
  • Use the NativeUtils::displayFilePicker() method to open a platform-specific file dialog. The NativeUtils::filePickerFinished signal emits when the user selects a file or closes the dialog.

     import Felgo
     import QtQuick
    
     App {
       NavigationStack {
         Page {
           title: qsTr("File Dialog")
    
           AppButton {
             text: "Open File Dialog"
             onClicked: NativeUtils.displayFilePicker()
             anchors.centerIn: parent
           }
    
           Connections {
             target: NativeUtils
             onFilePickerFinished: {
               if(!accepted)
                 console.log("File Dialog Canceled")
               else {
                 console.log(files)
               }
             }
           }
         }
       }
     }
  • The LocaleAwareSorter now provides a natural sorting across platforms also when operating case-sensitive. In addition, you can now activate the LocaleAwareSorter::numericMode to sort alphanumeric strings correctly.

Improvements

  • Move the DatePicker to a specific date or interval with the scrollToDate(date) or scrollToDuration(duration) methods. While the control is being flicked, the flick takes priority and determines the final value. To interrupt all tumbler movement and fully reset the DatePicker, you can use setDate(date) and setDuration(duration).
  • The SectionSelect is now case-insensitive and treats accent characters as regular letters. This is the desired behavior in most cases and the new default. To change it you can use the caseSensitive and ignoreDiacritics properties.

    In addition, the improved control initializes faster and emits the selected(character, itemIndex) signal when the user chooses a section. For advanced use-cases, you can also deactivate the autoUpdate property and use the update() method to synchronize the control with the model of the target view on-demand.

  • The ImagePicker on Android now returns actual file URIs instead of ContentProvider URIs.

Fixes

  • On desktop platforms, the NativeUtils::displayTextInput() method now allows to rename the button text to accept or cancel the input.
  • The AppTextEdit placeholder text correctly respects the configured padding values.
  • Felgo Hot Reload supports line breaks in the log output.
  • For Camera examples the Felgo Developer App on macOS now requests Camera permission from the operating system.
  • Fixes the App::keyboardHeight to report consistent values on different Android devices.
  • The Notification Plugin correctly presents notifications on latest Android versions when the app is no longer running.
  • Fix Facebook Login behavior in certain cases, to use correct default behavior.
  • Update the Chartboost Plugin on Android to version 8.4.3.
  • Update the Flurry Plugin on Android to version 13.3.0.

Older Felgo Releases

v 3.10.0 (2022-07-14)

Highlights Blog Post: Release 3.10.0: Native Support for NFC Tags, Network Connection Type & Inline AdMob Banners, Qt Creator 7.0.2

Felgo 3.10.0 adds new native features to read NFC messages in NDEF format, access the network connectivity type on iOS & Android or display a native file picker. It also includes a new AdMob type to show banner ads inline with other QML elements.

Felgo 3.10.0 comes as a free update for all Felgo developers.

Update Now (New to Felgo? Get started here)

Felgo 3.10.0 Migration Hints

  • Android SDK Update to API 31

    Starting August 2022, API level 31 or above is required to publish applications on the Google Play Store. Make sure to update your Android build configuration to use the latest recommended settings and get support for Android 12 (API level 31). To do so, open the Qt Creator Android device settings and install all the suggested packages:

    Qt Creator will ask you to add the necessary components and automatically download the required packages upon your approval. You can also manually install the packages with the Android SDK Manager. To support Android 12, install the Android SDK Platform 31, as well as Android build tools version 31.0.0. When you build a project, it will automatically default to the highest installed Android SDK and build tools version.

  • The latest Android settings also require you to use Java 11 instead of Java 8. You can download the Java Development Kit 11 here.
  • In your android/build.gradle configuration, update to Android Gradle plugin 7.2.0 or higher:
     buildscript {
         dependencies {
             // UPDATE THIS:
             classpath 'com.android.tools.build:gradle:7.2.0'
         }
     }
  • Add the android:exported flag to your android/AndroidManifest.xml configuration:
     <activity ... android:exported="true">
  • Clean the build directory & rebuild the project to make sure the configuration changes are loaded as expected.
  • Migration tip for existing projects: If you want to make sure your project does not miss any important configuration, you can use the Felgo project wizard to create a clean application for reference.

Highlights

  • NFC on Android and iOS: The new NativeUtils::startNfcNdefSession() method allows to read in NDEF message formatted NFC tags as a lightweight alternative to QtNFC for Android and iOS.

  • The new AdMobBannerNative type allows embedding an ad banner directly into your QML UI.

New Features

  • The new NativeUtils::connectionType property tells about the current network connectivity (cellular, wifi or none) on Android and iOS.

  • The Felgo debug menu bar now includes an option to simulate changing the App::isOnline property (this does not set a device offline, just changes the return value of the isOnline property):

  • The Felgo debug menu bar includes new options for predefined device resolutions.
  • You can now request to delete the Firebase User that is currently logged in with the FirebaseAuth::deleteUser() method.
  • Use the NativeUtils::displayFilePicker() method to open a platform-specific file dialog. The NativeUtils::filePickerFinished signal emits when the user selects a file or closes the dialog.

     import Felgo
     import QtQuick
    
     App {
       NavigationStack {
         Page {
           title: qsTr("File Dialog")
    
           AppButton {
             text: "Open File Dialog"
             onClicked: NativeUtils.displayFilePicker()
             anchors.centerIn: parent
           }
    
           Connections {
             target: NativeUtils
             onFilePickerFinished: {
               if(!accepted)
                 console.log("File Dialog Canceled")
               else {
                 console.log(files)
               }
             }
           }
         }
       }
     }
  • The LocaleAwareSorter now provides a natural sorting across platforms also when operating case-sensitive. In addition, you can now activate the LocaleAwareSorter::numericMode to sort alphanumeric strings correctly.

Improvements

  • Move the DatePicker to a specific date or interval with the scrollToDate(date) or scrollToDuration(duration) methods. While the control is being flicked, the flick takes priority and determines the final value. To interrupt all tumbler movement and fully reset the DatePicker, you can use setDate(date) and setDuration(duration).
  • The SectionSelect is now case-insensitive and treats accent characters as regular letters. This is the desired behavior in most cases and the new default. To change it you can use the caseSensitive and ignoreDiacritics properties.

    In addition, the improved control initializes faster and emits the selected(character, itemIndex) signal when the user chooses a section. For advanced use-cases, you can also deactivate the autoUpdate property and use the update() method to synchronize the control with the model of the target view on-demand.

  • The ImagePicker on Android now returns actual file URIs instead of ContentProvider URIs.

Fixes

  • On desktop platforms, the NativeUtils::displayTextInput() method now allows to rename the button text to accept or cancel the input.
  • The AppTextEdit placeholder text correctly respects the configured padding values.
  • Felgo Hot Reload supports line breaks in the log output.
  • For Camera examples the Felgo Developer App on macOS now requests Camera permission from the operating system.
  • Fixes the App::keyboardHeight to report consistent values on different Android devices.
  • The Notification Plugin correctly presents notifications on latest Android versions when the app is no longer running.
  • Fix Facebook Login behavior in certain cases, to use correct default behavior.
  • Update the Chartboost Plugin on Android to version 8.4.3.
  • Update the Flurry Plugin on Android to version 13.3.0.

v 3.9.2 (2021-12-01)

Highlights Blog Post: Release 3.9.2: WhatsApp Messenger Demo, Clear the Live Reload Cache and Control the App Navigation Flow

Felgo 3.9.2 includes a messenger demo similar to WhatsApp, adds a new way to clear the Felgo Live project cache, and gives more control over the app navigation flow.

Felgo 3.9.2 comes as a free update for all Felgo developers.

Update Now (New to Felgo? Get started here)

Highlights

  • Have a look at the Messenger App demo to see how to provide a user interface just like WhatsApp:

  • In addition to clearing the Hot Reload Client's project cache, you can now also clear the cache remotely with the Felgo Hot Reload GUI application. To do so, open the Felgo Hot Reload settings, enable the "Advanced options", and click the "Clear Cache" button.

  • The ImagePicker has new APIs that give more control over the current photo selection. Use the ImagePicker::select() or ImagePicker::deselect() methods to add or remove certain photos from the selection. To implement a fully custom selection handling, disable the ImagePicker::autoSelectClickedPhotos property and add your own logic with the ImagePicker::photoClicked() signal.

    The following example does not block the image selection when the maximum number is reached and instead deselects the first photo to make space for the new one:

     import Felgo
     import QtQuick
    
     App {
       NavigationStack {
         Page {
           id: page
           title: qsTr("Choose Photos")
    
           ImagePicker {
             anchors.fill: parent
             maximumNumberOfSelection: 2
             autoSelectClickedPhotos: false
             onPhotoClicked: {
               // clicking a selected photo deselects it
               if(selectionIndices.indexOf(photoIndex) > -1) {
                 deselect(photoIndex)
               }
               else {
                 // if the maximum selection count is reached, deselect the first photo
                 if(selectedCount == maximumNumberOfSelection) {
                   let firstPhotoIdx = selectionIndices[0]
                   deselect(firstPhotoIdx)
                 }
    
                 // select the clicked photo
                 select(photoIndex)
               }
             }
           }
         }
       }
     }
  • Use the AppPage::backSwipeEnabled property to disable the swipe back gesture on iOS, while still allowing to navigate back using the default back button in the navigation bar. Setting this property only has an effect if the Page is used inside a NavigationStack.
  • The AppPage::willPop signal triggers whenever the Page is about to be popped from its NavigationStack. If you want to stop the pop from being executed, you can set event.accepted to false.
     onWillPop: {
       event.accepted = false
     }

    Similarly, the NavigationItem::willChange signal triggers whenever the current NavigationItem is about to be changed. Set event.accepted to false to stop the change from being executed.

     onWillChange: {
       event.accepted = false
     }

    Also, the AppModal::willClose signals when the modal is about to close. Set event.accepted to false to stop the close from being executed.

     onWillClose: {
       event.accepted = false
     }

    These signals can be useful to e.g. show a confirmation dialog to check if the user really wants to leave the current page or menu item.

New Features

Improvements

  • The Facebook Plugin now uses the Facebook SDK v8.2.0 on Android. This lets the Facebook Login use Chrome custom tabs instead of WebView. This update is required until October 5th, 2021. You can read more about this change on the Facebook Developer portal.
  • You now have more control over the Facebook Plugin's internal behavior. Use the new properties Facebook::autoLogAppEventsEnabled and Facebook::advertiserIdCollectionEnabled for this.
  • The Firebase Plugin can now use the latest version of the Firebase gradle plugin on Android. This can fix some problems and warnings with initialization of Firebase. To use this, open your android/build.gradle and update the version to 4.3.10. Also move the gradle plugin from the very bottom to the other plugins.
     buildscript {
         dependencies {
             // update version here:
             classpath 'com.google.gms:google-services:4.3.10'
         }
     }
    
     apply plugin: 'com.android.application'
     // move this from the very bottom to here:
     apply plugin: 'com.google.gms.google-services'
  • FileUtils::writeFile() now uses UTF-8 encoding to support a wider range of characters. This also applies to FileUtils::copyFile().

    NativeUtils::displayImagePicker() now preserves the original image format instead of converting every image to JPEG on Android and iOS.

  • HttpRequest now correctly treats application/pdf content type as binary data.
  • DatePicker now orders individual year, month and day tumblers based on the specified dateFormat when useCombinedDate is false.
  • SimpleRow layouts that use an image or icon include additional spacing to match the text with the page title position on Android. Deactivate the SimpleRow::alignTextWithTitle property to disable this feature and not align text with the title position.

Fixes

  • AppModal can now also hold non-visual components like a Timer, Connection or QtObject as child elements.
  • Fixes a potential crash with NativeView on iOS.
  • Fixes a potential crash with AdMobBanner on iOS.
  • Fixes an issue with the FirebaseDatabase::getValue() sometimes returning a wrong key on Android. The issue occurred when the method is called at app start while also using realtime keys.
  • Log output from the Felgo Hot Reload Client is now treated as plain text instead of HTML.
  • Corrects the left margin for menu entries within the Android navigation drawer on retina screens.
  • Fixes NativeUtils::safeAreaInsets and NativeUtils::statusBarHeight on Android when using the Qt::AA_EnableHighDpiScaling setting.

v 3.9.1 (2021-08-04)

Highlights Blog Post: Release 3.9.1: Publish Qt Apps as Android App Bundle on Google Play and Configure Icon Sizes in the Felgo Theme

Felgo 3.9.1 adds support for Android App Bundle builds to publish apps on Google Play and improves the configuration of default icon sizes in the Felgo Theme.

Felgo 3.9.1 comes as a free update for all Felgo developers.

Update Now (New to Felgo? Get started here)

Felgo 3.9.1 Migration Hints

  • The Android minSdkVersion and targetSdkVersion is not allowed to be set in the AndroidManifest.xml file anymore. Remove this line from android/AndroidManifest.xml:
     <uses-sdk android:minSdkVersion="xx" android:targetSdkVersion="yy"/>
  • Set the min & targetSdkVersion in the Android gradle buildscript instead. Update the file android/build.gradle:
     android {
          defaultConfig {
           multiDexEnabled true
           targetSdkVersion   androidCompileSdkVersion.toInteger()
           applicationId    = productIdentifier
           versionCode      = productVersionCode.toInteger()
           versionName      = productVersionName
           // ADD THIS:
           minSdkVersion    = project.hasProperty("qtMinSdkVersion") ? qtMinSdkVersion.toInteger() : 21
         }
     }
  • Also update to Android Gradle plugin 3.6.0 or higher and replace the jcenter repository with mavenCentral:
     buildscript {
         repositories {
             // REMOVE THIS:
             jcenter()
             // ADD THIS:
             mavenCentral()
         }
    
         dependencies {
             // UPDATE THIS:
            classpath 'com.android.tools.build:gradle:3.6.0'
         }
     }
    
     allprojects {
         repositories {
             // REMOVE THIS:
             jcenter()
    
             // ADD THIS:
             mavenCentral()
         }
     }
  • Android SDK Update to API 30

    Open QtCreator -> Settings -> Devices -> Android. On the bottom you can find options to install AVD and SDK packages, select the SDK-Manager tab. Expand the section for android-30 (or higher) and install the SDK Platform. When you build a project now, it will automatically default to the highest installed Android SDK Platform version.

  • Clean the build directory & rebuild the project to make sure the configuration changes are loaded as expected.
  • Migration tip for existing projects: If you want to make sure your project does not miss any important configuration, you can use the project wizard to create a clean application for reference.

Highlights

Android App Bundle Support
  • Overview

    You can now build Felgo projects as AAB (Adndroid App Bundle) for publishing on Google Play.

    The App Bundle is a format for release distribution, you cannot install one directly on a device. In contrast, APKs are for use on devices. An AAB file is an archive that contains all necessary data to generate APKs for installation on devices. The distributor (i.e. Google Play, Amazon) uses the App Bundle to generate optimized APKs, which are then signed with your provided credentials. Similar to APKs, an App Bundle needs to be signed with a regular keystore before you upload it. The distributor will check the signature to verify the integrity of the uploaded file.

  • Google Play App Upload Requirements

    Starting with August 2021 all applications must be uploaded to Google Play as Android App Bundles. Publishing APKs directly is no longer supported. Furthermore, the minimum Android SDK Platform (targetSdkVersion) increased to API 30. The minimum supported Android version (minSdkVersion) for Qt projects did not change and stays at Android 5.0 (v21).

  • Enable Google Play Signing (& AppBundles)

    Visit the Google Play Developer Console and open the dashboard for an existing app (or setup a new app). Open the Internal Test section at the sidebar and start the preparation of a new release. You are asked to enable Google Play Signing and are given multiple options to choose from. Felgo recommends to use the Java KeyStore option with the PEPK-Tool. This way you can continue to use your existing Android keystore. Follow the steps on the website to finish setting up Google Play signing and release preparation.

  • How to build AppBundles with Qt Creator?

    Open your project and select the Android Multi Kit (Qt 5.15.2). Felgo recommends to keep the Debug build configuration "as is", so you can keep testing your apps on Android with a traditional installable APKs hassle-free.

    To create a distributable Android App Bundle, switch to the Android kit Release build configuration in the bottom-left menu. Go to the Projects tab afterwards, which allows to create AABs for release now. In the first section, enable at least the arm64-v8a ABI.

    In the Build Android APK section, use the keystore containing the correct upload certificate (previously created up at Google Play Signing). Also check the Build .aab (Android App Bundle) option and make sure the build SDK is android-30 or higher.

  • How to build & deploy Android App Bundles with Felgo Cloud Builds?

    With Felgo 3.9.1, all Android application builds on Cloud Builds will also create App Bundles in addition to APKs. You can find the download buttons for all the build artifacts at the top-right corner of each successful Android build:

    If you configured automatic store deployment, Cloud Builds only uploads the App Bundle to Google Play (instead of two APKs).

New Features

  • Use the LocaleAwareSorter for a natural string sorting with consistent behavior across platforms. It is especially useful on mobile platforms, where the existing StringSorter produces varying results due to different implementations of QCollator.

    The new sorter implements a natural sort order based on the current locale setting. For strings that include accents (diacritics), it's also possible to treat accented characters as regular letters. To do so, activate the LocaleAwareSorter::ignoreDiacritics setting.

     import QtQuick
     import Felgo
    
     App {
    
       // list model for json data
       JsonListModel {
         id: jsonModel
         keyField: "id"
         source: [
           {id: 1, title: "Apple" },
           {id: 2, title: "Ham" },
           {id: 3, title: "Bacon" },
           {id: 4, title: "Banana" },
           {id: 5, title: "Strawberry" },
           {id: 1, title: "Äpple" },
           {id: 3, title: "Baçon" },
           {id: 4, title: "banana" },
           {id: 5, title: "Strawberry" }
         ]
       }
    
       SortFilterProxyModel {
         id: sortedModel
         sourceModel: jsonModel
         sorters: [
           LocaleAwareSorter {
             id: localeAwareSorter
             roleName: "title"
             ignoreDiacritics: true
           },
           StringSorter {
             id: stringSorter
             roleName: "title"
             enabled: false
           }
         ]
       }
    
       NavigationStack {
         Page {
           title: "String Sorting"
    
           AppListView {
             model: sortedModel
             delegate: AppListItem {
               text: model.title
             }
             header: Item {
               anchors.left: parent.left
               anchors.right: parent.right
               anchors.margins: dp(16)
               height: dp(50)
    
               AppCheckBox {
                 text: "LocaleAwareSorter"
                 anchors.verticalCenter: parent.verticalCenter
                 checked: localeAwareSorter.enabled
                 updateChecked: false
                 onClicked: {
                   localeAwareSorter.enabled = !localeAwareSorter.enabled
                   if(localeAwareSorter.enabled)
                     stringSorter.enabled = false
                 }
               }
    
    
               AppCheckBox {
                 text: "StringSorter"
                 anchors.right: parent.right
                 anchors.verticalCenter: parent.verticalCenter
                 checked: stringSorter.enabled
                 updateChecked: false
                 onClicked: {
                   stringSorter.enabled = !stringSorter.enabled
                   if(stringSorter.enabled)
                     localeAwareSorter.enabled = false
                 }
               }
             }
           }
         }
       }
     }

    StringSorter features like the numericMode and ignorePunctation are not yet implemented for the LocaleAwareSorter. In case you require these features for your project or have requests for other sorting options, please contact us.

Improvements

Fixes

v 3.9.0 (2021-07-01)

Highlights Blog Post: Release 3.9.0: WebAssembly Browser Communication and Improved UX with Overlays, Tooltips and Intros

Felgo 3.9.0 adds easy WebAssembly browser communication using JavaScript, new QML components for overlays and tool tips and many SDK improvements.

Felgo 3.9.0 comes as a free update for all Felgo developers.

Update Now (New to Felgo? Get started here)

Felgo 3.9.0 Migration Hints

  • Felgo now uses AndroidX components on Android to replace the old support library. It also now uses version 3.6.0 of the Android Gradle plugin.

    For new Felgo projects, no changes are required.

    If you created your project with a previous version of Felgo, update your android/build.gradle. Update the android gradle plugin and dependencies:

     buildscript {
         // ... repositories
    
         dependencies {
             // UPDATE VERSION:
             classpath 'com.android.tools.build:gradle:3.6.0'
         }
     }
    
     dependencies {
         implementation fileTree(dir: 'libs', include: ['*.jar'])
    
         // ADD THIS:
         implementation "androidx.appcompat:appcompat:1.2.0"
    
         // REMOVE THIS:
         // implementation "com.android.support:support-core-utils:28.0.0"
         // implementation "com.android.support:appcompat-v7:28.0.0"
    
         // ... more dependencies
     }

    Also update the file provider class name in android/AndroidManifest.xml:

     <!-- UPDATE android:name HERE: -->
     <provider android:name="androidx.core.content.FileProvider"
         android:authorities="${applicationId}.fileprovider"
         android:exported="false" android:grantUriPermissions="true">

    When using Felgo Plugins, make sure to use Java 1.8 in your Android build:

     android {
       ...
       compileOptions {
         sourceCompatibility JavaVersion.VERSION_1_8
         targetCompatibility JavaVersion.VERSION_1_8
       }
       ...
     }
  • To use AdMob on Android, you will now have to provide your AdMob app ID in your AndroidManifest.xml file. You can find more details below in the distinct AdMob section of this changelog entry, or refer to the Android integration guide directly.

Highlights

  • Seamless communication between browser JavaScript and Qt QML WebAssembly apps: By using a Felgo implementation of WebChannel transport, it's now possible to interact with shared objects from QML directly in the browser JavaScript. No need for custom C++ bindings anymore.
     import Felgo
     import QtQuick
    
     App {
    
       webObjects: [
         QtObject {
           id: qmlDefinedObject
           property int count
           property string myString: "Hello!"
    
           function qmlMethod() {
             console.log("I was called from the browser!")
             return "You can return anything!"
           }
         }
       ]
    
       AppButton {
         anchors.centerIn: parent
         text: "Increment count"
         onClicked: {
           qmlDefinedObject.count++;
         }
       }
     }

    On the browser side you can handle value changes via connections, read or write properties and call methods of your shared objects:

     function felgoInitWebTransport() {
       ...
    
       new QWebChannel(wasmTransport, function(channel) {
         webObject = channel.objects.webObject;
    
         let qmlDefinedObject = shareObjects.qmlDefinedObject;
    
         qmlDefinedObject.countChanged.connect() {
           console.log("Count updated!", qmlDefinedObject.count)
         }
    
         qmlDefinedObject.myString = "Hi! I was updated from the browser";
    
         qmlDefinedObject.qmlMethod( result => {
           console.log("qmlMethod returned", result)
         });
    
       })
    
       ...
     }

    See the WebAssembly routing example for a demo application that uses this technology to control a QML MapView with browser input.

  • The new AppOverlay type allows to display any custom QML item or component as a modal overlay. It automatically covers item creation, layouting and animations for opening and closing the overlay.

     import Felgo
     import QtQuick
    
     App {
       NavigationStack {
         Page {
           title: "Dynamic Overlay"
    
           AppButton {
             text: "Open Overlay"
             anchors.centerIn: parent
             onClicked: myOverlay.open()
           }
    
           AppOverlay {
             id: myOverlay
             sourceItem: overlayComponent
             onOpening: item.closeClicked.connect(myOverlay.close)
           }
    
           Component {
             id: overlayComponent
             Rectangle {
               id: item
               anchors.centerIn: parent
               color: Theme.backgroundColor
               width: dp(250)
               height: dp(130)
    
               signal closeClicked
    
               AppText {
                 text: "Dynamic Overlay"
                 y: dp(36)
                 anchors.horizontalCenter: parent.horizontalCenter
               }
    
               AppButton {
                 text: "Close"
                 anchors.horizontalCenter: parent.horizontalCenter
                 anchors.bottom: parent.bottom
                 flat: true
                 onClicked: item.closeClicked()
               }
             }
           }
         }
       }
     }
  • Use the AppToolTip item to display informational content for a target QML element. The tool tip automatically positions itself depending on the target's position and highlights the target by darkening the surrounding area.

     import Felgo
     import QtQuick
    
     App {
       NavigationStack {
         Page {
           title: "ToolTip Page"
    
           AppButton {
             id: myButton
             text: "Open ToolTip"
             anchors.centerIn: parent
             onClicked: myToolTip.open()
           }
    
           AppToolTip {
             id: myToolTip
             target: myButton
             text: "This button opens a tool tip."
           }
         }
       }
     }

New Features

  • News Demo App: How to Create a News Application with Felgo

    With the latest addition to the Felgo app demos, you can learn how to build an application that shows the latest breaking news:

    The full source code of the demo is available on GitHub. You can also find the new demo in the latest version of the Felgo Developer App.

  • The SortFilterProxyModel offers an improved sorting performance and also supports asynchronous sorting with the delayed property.
     import Felgo
     import QtQuick
    
     App {
       // data model
       ListModel {
         id: fruitModel
    
         ListElement {
           name: "Orange"
           cost: 3.25
         }
         ListElement {
           name: "Banana"
           cost: 1.95
         }
         ListElement {
           name: "Apple"
           cost: 3.75
         }
         ListElement {
           name: "Banana"
           cost: 2.35
         }
         ListElement {
           name: "Orange"
           cost: 1.25
         }
         ListElement {
           name: "Apple"
           cost: 2.45
         }
       }
    
       // sorted model for list view
       SortFilterProxyModel {
         id: sortedFruitModel
    
         // perform sort in the background, only sorts once when changing many sorters
         delayed: true
    
         sourceModel: fruitModel
         sorters: [
           StringSorter {
             id: nameSorter
             roleName: "name"
           },
           StringSorter {
             id: costSorter
             roleName: "cost"
           }
         ]
       }
    
       // list page
       NavigationStack {
         ListPage {
           id: listPage
           title: "SortFilterProxyModel"
           model: sortedFruitModel
           delegate: SimpleRow {
             text: name
             detailText: "cost: "+cost
             style.showDisclosure: false
           }
    
           // add checkbox to activate sorter as list header
           listView.header: AppCheckBox {
             text: "Sort by name and cost"
             checked: nameSorter.enabled
             updateChecked: false
             onClicked: {
               nameSorter.enabled = !nameSorter.enabled
               costSorter.enabled = nameSorter.enabled
             }
             height: dp(48)
             anchors.horizontalCenter: parent.horizontalCenter
           }
         } // ListPage
       } // NavigationStack
     } // App

    Use the sortFinished() signal in case you want to run code after the sorting has completed. In addition to the asynchronous sorting, you can also take advantage of new sorter and proxy role types: FilterSorter, FilterRole, RegExpRole and SingleRole.

  • The improved SortFilterProxyModel is also capable of acting as a proxy for a QML TableModel. To correctly work with tables and access table columns with role-based sorters, configure the columnRoleNames property.

    The following example uses a TableModel and TableView together with SortFilterProxyModel:

     import QtQuick
     import Felgo
     import Qt.labs.qmlmodels // for TableModel
    
     App {
       NavigationStack {
         Page {
           title: "Table Model Sorting"
           TableModel {
             id: myTableModel
             TableModelColumn { display: "checked" }
             TableModelColumn { display: "amount" }
             TableModelColumn { display: "fruitType" }
             TableModelColumn { display: "fruitName" }
             TableModelColumn { display: "fruitPrice" }
    
             // Each row is one type of fruit that can be ordered
             rows: [
               {
                 checked: true,
                 amount: 4,
                 fruitType: "Orange",
                 fruitName: "Navel",
                 fruitPrice: 2.50
               },
               {
                 checked: false,
                 amount: 1,
                 fruitType: "Banana",
                 fruitName: "Cavendish",
                 fruitPrice: 3.50
               },
               {
                 // Each property is one cell/column.
                 checked: false,
                 amount: 1,
                 fruitType: "Apple",
                 fruitName: "Granny Smith",
                 fruitPrice: 1.50
               }
             ]
           }
    
           SortFilterProxyModel {
             id: sortedModel
             sourceModel: myTableModel
             columnRoleNames: ["checked", "amount", "fruitType", "fruitName", "fruitPrice"]
             sorters: [
               RoleSorter {
                 id: priceSorter
                 roleName: "fruitPrice"
               }
             ]
           }
    
           AppCheckBox {
             id: sortSetting
             text: "Sort by Price"
             anchors.horizontalCenter: parent.horizontalCenter
             checked: priceSorter.enabled
             updateChecked: false
             onClicked: priceSorter.enabled = !priceSorter.enabled
             y: dp(24)
           }
    
           TableView {
             anchors {
               top: sortSetting.bottom
               bottom: parent.bottom
               left: parent.left
               right: parent.right
               topMargin: dp(24)
             }
             columnSpacing: dp(12)
             rowSpacing: dp(12)
    
             model: sortedModel
             delegate: AppText {
               text: model.display
               padding: dp(6)
             }
           }
         }
       }
     }

    In addition to the TableModel support and better sorting performance, the new customSortOrder property may be used to sort models with a custom list of sort positions.

  • Browser Geolocation API is now supported on WebAssembly. QML apps deployed to the web can access the user location. Safari not yet supported.
  • Due to MapBox legacy API deprecation, the WebAssembly QML Maps MapBox tiled plugin is now updated. You can now use the new modern tiled styles with MapBox in WebAssembly apps.

Improvements

  • Improves handling of safe area with display notches and cutouts on Android. Felgo games and apps can now also draw content behind the system navigation bar. This affects devices with a soft back/home button row on the touchscreen.

    Note: Similar to iOS, the bottom safe area is not automatically kept blank by the Page component. To handle this in your custom layouts you can use the AppPage::safeArea item for anchoring, or the NativeUtils::safeAreaInsets to add additional spacing in your UI if required. Those insets will be 0 on devices that are not affected, so this will work correct on any device.

     import QtQuick
     import Felgo
    
     App {
       Navigation {
         navigationMode: navigationModeDrawer
    
         NavigationItem {
           title: "Page"
           icon: IconType.square
    
           NavigationStack {
             Page {
               title: "Page"
    
               Rectangle {
                 // Use safeArea item of Page for anchoring custom layouts
                 anchors.fill: parent.safeArea
                 color: "#f04e26"
               }
               AppButton {
                 text: "Bottom Button"
                 anchors.horizontalCenter: parent.horizontalCenter
                 // Anchor an item to the bottom safe area
                 anchors.bottom: parent.safeArea.bottom
               }
             }
           }
         }
         NavigationItem {
           title: "Custom Bottom Bar"
           icon: IconType.minus
    
           NavigationStack {
             Page {
               title: "Page"
    
               // This would be your custom bottom bar
               Rectangle {
                 color: Theme.colors.tintColor
                 width: parent.width
                 // Use your content height and add the bottom safe area
                 height: dp(50) + NativeUtils.safeAreaInsets.bottom
                 // Anchor the whole bar to the very bottom
                 anchors.bottom: parent.bottom
               }
             }
           }
         }
         NavigationItem {
           title: "List / Flickable"
           icon: IconType.list
    
           NavigationStack {
             Page {
               title: "List / Flickable"
    
               AppListView {
                 width: parent.width
                 // This is now applied by default already
                 bottomMargin: NativeUtils.safeAreaInsets.bottom
    
                 model: 30
                 delegate: AppListItem {
                   text: "Item " + index
                 }
               }
             }
           }
         }
       }
     }
  • ImagePicker now correctly displays images that are stored on iCloud on iOS, sorts images by date taken on Android, and provides a new method ImagePicker::clearSelection() to clear out the current selection.
  • The AdMob Plugin now uses the AdMob SDK version 8.2.0 on iOS. The plugin now automatically asks the user for App Tracking Transparency authorization on iOS 14.5+ to use the IDFA for tracking purposes. Use the new properties AdMobBanner::requestAdTrackingAuthorization, AdMobInterstitial::requestAdTrackingAuthorization and AdMobRewardedVideo::requestAdTrackingAuthorization to enable the feature.

    Note: To support the ad tracking authorization, adapt your ios/Project-Info.plist. Add the NSUserTrackingUsageDescription key with a description of usage. Example:

     <key>NSUserTrackingUsageDescription</key>
     <string>This identifier will be used to deliver personalized ads to you.</string>

    Note: The usage of the AppTrackingTransparency framework requires Xcode 12 or later for building iOS apps. This update is required for new apps starting with iOS 14.5.

  • The AdMob Plugin now uses the AdMob SDK version 19.8.0 on Android.

    Note: This mandatory update requires you to add your AdMob app ID to your android/AndroidManifest.xml. You can find your AdMob app id in the AdMob app console. Add this code to your manifest:

     <!-- Sample AdMob app ID: ca-app-pub-3940256099942544~3347511713 -->
     <meta-data
         android:name="com.google.android.gms.ads.APPLICATION_ID"
         android:value="ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy"/>

    For testing, you can use the sample ID as shown above. For publishing your app, use your use your actual AdMob app ID. You can find more information in the official AdMob documentation.

    Note: For existing Felgo projects, please update your iOS AdMob frameworks as described in the iOS integration guide.

  • The Firebase Plugin now uses the latest Firebase SDK versions. It uses the versions 7.9.0 on iOS and 19.0.0 on Android.

    Note: For existing Felgo projects, please update your iOS Firebase frameworks as described in the iOS integration guide.

  • The OneSignal Plugin now uses the SDK version 3.15.7 on Android. This is only a compatibility update. It does not require any changes in existing Felgo projects.
  • NativeUtils::galleryPhotos now supports scoped storage for Android 10+. The assetPath entry will contain a content:// URI instead of a file:// URI starting from Android 10. You can use this URI anywhere a file URI is expected in QML. Read more about the changes in the Android docs.

    Note: This is only supported when building with Qt 5.15+. In case you use a lower Qt version, the paths will still use legacy external storage. On Android 10, you can add <application android:requestLegacyExternalStorage="true" ...> to your AndroidManifest.xml to support this. It will no longer work on Android 11+.

  • The NativeUtils::softInputMode property is now also supported on iOS. It supports the modes NativeUtils.AdjustPan and NativeUtils.AdjustNothing.
  • The Amplitude Plugin now uses the latest Amplitude SDK version, version 8.3.0 on iOS and 2.31.0 on Android.

    It supports the latest iOS 14.5+ changes regarding App Tracking Transparency when using Amplitude::useAdvertisingIdForDeviceId. See the property's documentation for more information how to support IDFA.

  • Updates the Soomla Plugin's Google Play billing service. It now uses the billing library SDK version 4.0.0 on Android. This update is mandatory for app updates submitted to the Google Play Store starting November 1, 2021.

Fixes

v 3.8.0 (2021-03-04)

Highlights Blog Post: Release 3.8.0: Call Native APIs from QML with JavaScript, Build for the Raspberry Pi and Update to Qt 5.15.2

Felgo 3.8.0 adds Native Code Components for integrating iOS and Android views or working with native APIs directly from QML. You also get a ready-made Felgo Build Kit to build Qt and Felgo apps for the Raspberry Pi. The update to Qt 5.15.2 brings you all features and improvements of Qt 5.15.

Felgo 3.8.0 comes as a free update for all Felgo developers.

Update Now (New to Felgo? Get started here)

Felgo 3.8.0 Migration Hints

  • The Android target now bundles all available ABIs in a combined Build Kit. Configure your desired ABIs in the project settings to include them in your build:

    The 3.7.0 Build Kits for Android initially stay in place and can be safely removed after the update with the Add or remove components option of the MaintenanceTool.

  • The minimum required Android NDK version increased to NDK r20.
  • Felgo for iOS now requires Xcode 11.4 or higher. For more information see the iOS deployment guide.

Highlights

  • QML Native Code Components API: Call Native Platform APIs and Embed Native Views in QML using JavaScript

    You no longer need to provide custom wrapper types in C++ to bridge between QML and native Java or Objective-C code. Access native platform features from JavaScript by calling the desired APIs with the NativeObject item.

    You can get references to native classes and objects in QML, and directly call methods to perform native operations or retrieve data. This makes it easy to trigger platform APIs, access device settings or request permissions from the system. This example retrieves the battery level from the system and displays it in QML:

     import Felgo
     import QtQuick
    
     App {
      AppButton {
        anchors.centerIn: parent
        text: qsTr("Check Battery")
        onClicked: {
          var batteryPercent = Math.round(getBatteryLevel() * 100)
          text = "Battery: "+ batteryPercent + "%"
        }
      }
    
      // returns battery level between 0 and 1 on mobile platforms
      function getBatteryLevel() {
        // call platform-dependent implementation:
        if(Qt.platform.os === "android") {
          return getAndroidBatteryLevel()
        }
        else if(Qt.platform.os === "ios") {
          return getIosBatteryLevel()
        }
        else {
          return 0
        }
      }
    
      function getAndroidBatteryLevel() {
        var Intent = NativeObjectUtils.getClass("android/content/Intent")
        var IntentFilter = NativeObjectUtils.getClass("android/content/IntentFilter")
        var BatteryManager = NativeObjectUtils.getClass("android/os/BatteryManager")
    
        var context = NativeObjectUtils.getContext()
        var filter = IntentFilter.newInstance(Intent.getStaticProperty("ACTION_BATTERY_CHANGED"))
        var batteryStatus = context.callMethod("registerReceiver", [null, filter])
    
        var level = batteryStatus.callMethod("getIntExtra", [BatteryManager.getStaticProperty("EXTRA_LEVEL"), -1])
        var scale = batteryStatus.callMethod("getIntExtra", [BatteryManager.getStaticProperty("EXTRA_SCALE"), -1])
    
        return level / scale
      }
    
      function getIosBatteryLevel() {
        var UIDevice = NativeObjectUtils.getClass("UIDevice")
        var device = UIDevice.getStaticProperty("currentDevice")
        device.setProperty("batteryMonitoringEnabled", true)
        return device.getProperty("batteryLevel")
      }
     }

    It is also possible to render a native Android or iOS view in your Qt Quick scene with the new NativeView type. The type can be used cross-platform by specifying different native bindings for each of the platforms. For example, you can add a native Button, ImageView or WebView to your Felgo app:

  • Raspberry Pi Build Kit: Run Your Qt & Felgo Projects on the Pi

    The Raspberry Pi is a great board to get started with embedded development, but the cross-compilation and initial setup is not an easy task. To simplify application development for the Raspberry Pi 3, which is the most requested board, Felgo now provides pre-built libraries right within the MaintenanceTool:

    You can also directly jump into development and browse Felgo demos and features by installing the Felgo Developer App on your Pi. See Deploying Felgo Apps to Embedded Devices for more information.

New Features

  • Improved FileUtils API:
  • The DatePicker control makes it easy to input date on touch devices. You can use it to choose a date, time or time interval.

     import Felgo
     import QtQuick
    
     App {
       NavigationStack {
         Page {
           title: "Date Picker"
    
           AppText {
             text:  datePicker.selectedDate.toUTCString()
             anchors.horizontalCenter: parent.horizontalCenter
             anchors.bottom: datePicker.top
           }
    
           DatePicker {
             id: datePicker
             anchors.centerIn: parent
           }
         }
       }
     }

Improvements

  • NativeUtils::getCachedAssetPath() can now get photos stored in iCloud on iOS. This also allows ImagePicker to select iCloud images.
  • NativeUtils::galleryPhotos now also contains paths to a smaller image thumbnail, if one exists. It contains them in a new property called "thumbnailPath".
  • Improved ImagePicker component's performance. It now loads the images in a background thread. It also displays the thumbnail images, if available.
  • Updates the OneSignal iOS SDK to verson 2.11.1 to prevent warnings during an iOS build.

Fixes

v 3.7.0 (2020-10-20)

Highlights Blog Post: Release 3.7.0: Bluetooth LE (Low Energy) with QML

Felgo 3.7.0 adds new QML APIs to use Bluetooth LE from QML in your Qt and Felgo apps. This gives you a convenient way to use Bluetooth LE to connect to IoT, wearables and other custom devices, directly from QML, without any C++ code.

Felgo 3.7.0 comes as a free update for all Felgo developers.

Update Now (New to Felgo? Get started here)

Felgo 3.7.0 Migration Hints

This update contains important migration hints for Felgo projects created with earlier versions of the Felgo SDK.

  • For theming the bottom tab navigation, you now need to use Theme.navigationTabBar instead of Theme.tabBar. You can find more information in the detailed list of changes below.
  • The new Bluetooth LE APIs require any app to provide a new purpose string for iOS in the Project-Info.plist located in the ios folder of your project, also if you do not use Bluetooth. This will not be visible for your users, unless you actually use Bluetooth. Apple scans uploaded apps for their capabilities, and since the new APIs enable any Felgo app to make use of Bluetooth, it is required to add this purpose string, also if not actively used.
     <key>NSBluetoothPeripheralUsageDescription</key>
     <string>App would like to access Bluetooth.</string>
     <key>NSBluetoothAlwaysUsageDescription</key>
     <string>App would like to access Bluetooth.</string>
  • By November 2020 new uploaded Android apps and app updates need an increased minimum and target SDK version in the AndroidManifest.xml file of your projects. The new versions are android:minSdkVersion="21" and android:targetSdkVersion="29".

Felgo 3.7.0 Hotfix iOS Felgo Hot Reload Module

If you make use of the Felgo Hot Reload Module in a new project on iOS, as described here, please create a folder FelgoLive in your project, download this Imports.qml file and paste it into this folder. This will ensure that Qt picks up all the Qt module imports that the Felgo Hot Reload Module prepares. The result should look like this:

Highlights

  • You can now use Bluetooth LE directly from QML in your Qt and Felgo apps without any C++ code.

    This allows you to easily communicate with IoT, wearables and other custom devices using Bluetooth. You can find more information and examples in the documentation Use Bluetooth Low Energy and in the release blog post.

    Here is an example of how such a Bluetooth implementation could look like:

     import Felgo
     import QtQuick
    
     App {
       NavigationStack {
         Page {
           title: qsTr("BLE Battery")
    
           Rectangle {
             anchors.centerIn: parent
             width: parent.width * 0.6
             height: parent.height * 0.8
             radius: dp(30)
             border.color: 'black'
             border.width: dp(5)
    
             Rectangle {
               anchors.bottom: parent.bottom
               width: parent.width
               height: parent.height * batteryCharacteristic.value / 100
               color: batteryCharacteristic.value > 80 ? 'green' : (batteryCharacteristic.value > 30 ? 'orange' : 'red')
               radius: parent.radius
             }
           }
    
           AppText {
             anchors.centerIn: parent
             text: batteryCharacteristic.value + '%'
             fontSize: dp(15)
           }
         }
       }
    
       BluetoothLeManager {
         discoveryRunning: true
    
         BluetoothLeDevice{
           id: myBleDevice
    
           BluetoothLeService {
             uuid: 0x180F // Battery Service
             BluetoothLeCharacteristic {
               id: batteryCharacteristic
               uuid: 0x2A19 // Battery Characteristic
               dataFormat: 4 // 0x04 for uint8
    
               onValueChanged: {
                 // Value updates
                 console.log('Battery Level Changed', value)
               }
    
               onValidChanged: {
                 // Read initial value once characteristic is valid
                 if (valid) {
                   read()
                 }
               }
             }
           }
    
           onConnectedChanged: {
              // Reconnect logic
             if (!connected) {
               console.log('Trying to reconnect')
               connect()
             }
           }
         }
    
         onDeviceDiscovered: {
           // Match device with service UUID
           if (device.services.indexOf('{0000180f-0000-1000-8000-00805f9b34fb}') > -1) {
             myBleDevice.setDevice(device, true)
             discoveryRunning = false
           }
         }
       }
     }
iOS Android

  • This update introduces the AppListItem, a new base type for typical list items in your applications. The AppListItem improves both flexibility and performance compared to the SimpleRow.

    This extensive example shows how to create various different common list item layouts using the AppListItem component.

     import QtQuick
     import QtQuick.Controls as QC2
     import Felgo
    
     App {
       id: app
    
       NavigationStack {
         Page {
           title: "Custom AppListItem"
           backgroundColor: Theme.colors.secondaryBackgroundColor
    
           AppFlickable {
             anchors.fill: parent
             contentHeight: column.height
    
             Column {
               id: column
               width: parent.width
    
               bottomPadding: 2*dp(Theme.contentPadding)
    
               SimpleSection {
                 title: "Standard Items"
               }
    
               AppListItem {
                 text: "First"
                 rightText: "Longer rightText, really long"
               }
               AppListItem {
                 text: "Second with longer text"
                 rightText: "Hi"
               }
               AppListItem {
                 text: "An active item"
                 detailText: "This is disabled so it cannot be clicked"
                 active: true
                 enabled: false
                 lastInSection: true
               }
    
               SimpleSection {
                 title: "Images"
               }
    
               AppListItem {
                 text: "Using an image"
                 image: "https://via.placeholder.com/300"
               }
               AppListItem {
                 text: "Muted with image"
                 image: "https://via.placeholder.com/300"
                 muted: true
               }
    
               AppListItem {
                 text: "Image with"
                 detailText: "some detailText"
                 image: "https://via.placeholder.com/300"
                 lastInSection: true
               }
    
               SimpleSection {
                 title: "Custom Items"
               }
    
               AppListItem {
                 text: "Oh look, an icon"
                 rightText: "Nice!"
                 showDisclosure: false
    
                 leftItem: Icon {
                   icon: IconType.heart
                   anchors.verticalCenter: parent.verticalCenter
                   width: dp(26)
                 }
               }
               AppListItem {
                 text: "Wi-Fi"
                 rightText: "Connected"
    
                 leftItem: Rectangle {
                   color: Theme.colors.tintColor
                   radius: dp(5)
                   width: dp(26)
                   height: width
                   anchors.verticalCenter: parent.verticalCenter
    
                   Icon {
                     icon: IconType.wifi
                     anchors.centerIn: parent
                     color: "white"
                   }
                 }
               }
               AppListItem {
                 text: "General"
    
                 leftItem: Rectangle {
                   color: "grey"
                   radius: dp(5)
                   width: dp(26)
                   height: width
                   anchors.verticalCenter: parent.verticalCenter
    
                   Icon {
                     icon: IconType.cog
                     anchors.centerIn: parent
                     color: "white"
                   }
                 }
    
                 rightItem: Rectangle {
                   color: "red"
                   radius: width/2
                   width: dp(22)
                   height: width
                   anchors.verticalCenter: parent.verticalCenter
    
                   AppText {
                     anchors.centerIn: parent
                     color: "white"
                     text: "1"
                   }
                 }
               }
               AppListItem {
                 text: "Some Wifi Name"
                 showDisclosure: false
    
                 leftItem: Icon {
                   icon: IconType.check
                   color: Theme.colors.tintColor
                   width: dp(26)
                   anchors.verticalCenter: parent.verticalCenter
                 }
    
                 rightItem: Row {
                   spacing: dp(5)
                   anchors.verticalCenter: parent.verticalCenter
    
                   Icon {
                     icon: IconType.lock
                     width: sp(26)
                     height: width
                     anchors.verticalCenter: parent.verticalCenter
                   }
                   Icon {
                     icon: IconType.wifi
                     width: sp(26)
                     height: width
                     anchors.verticalCenter: parent.verticalCenter
                   }
                   IconButton {
                     icon: IconType.info
                     width: sp(26)
                     height: width
                     size: dp(22)
                     anchors.verticalCenter: parent.verticalCenter
                   }
                 }
               }
               AppListItem {
                 id: listItem
                 showDisclosure: false
                 mouseArea.enabled: false
                 topPadding: 0
                 bottomPadding: 0
    
                 leftItem: Icon {
                   icon: IconType.moono
                   width: sp(26)
                   height: width
                   anchors.verticalCenter: parent.verticalCenter
                 }
    
                 textItem: AppSlider {
                   height: dp(45)
                   width: listItem.textItemAvailableWidth
                   value: 0.3
                 }
    
                 rightItem: Icon {
                   icon: IconType.suno
                   width: sp(26)
                   height: width
                   anchors.verticalCenter: parent.verticalCenter
                 }
               }
               AppListItem {
                 text: "Custom detailText item"
                 image: "https://via.placeholder.com/300"
                 textVerticalSpacing: dp(10)
                 lastInSection: true
    
                 detailTextItem: Row {
                   spacing: dp(10)
                   Icon {
                     icon: IconType.heart
                   }
                   Icon {
                     icon: IconType.paperplane
                   }
                   Icon {
                     icon: IconType.automobile
                   }
                 }
               }
    
               SimpleSection {
                 title: "Switches"
               }
    
               AppListItem {
                 text: "This is a switch"
                 showDisclosure: false
                 mouseArea.enabled: false
    
                 rightItem: AppSwitch {
                   anchors.verticalCenter: parent.verticalCenter
                   checked: true
                 }
               }
               AppListItem {
                 text: "Whole item toggles switch"
                 detailText: "Switch checked: " + innerSwitch.checked
                 showDisclosure: false
    
                 rightItem: AppSwitch {
                   id: innerSwitch
                   anchors.verticalCenter: parent.verticalCenter
                   enabled: false
                 }
    
                 onSelected: {
                   innerSwitch.toggle()
                 }
               }
               AppListItem {
                 text: "A muted item"
                 muted: true
                 showDisclosure: false
                 lastInSection: true
    
                 rightItem: AppSwitch {
                   anchors.verticalCenter: parent.verticalCenter
                 }
               }
    
               SimpleSection {
                 title: "Radio Button Selected: " + ratioButtonGroup.checkedButton.value
               }
    
               QC2.ButtonGroup {
                 id: ratioButtonGroup
                 buttons: [radio1, radio2, radio3]
               }
    
               AppListItem {
                 text: "First Option"
                 showDisclosure: false
    
                 leftItem: AppRadio {
                   id: radio1
                   checked: true
                   value: "Option 1"
                   anchors.verticalCenter: parent.verticalCenter
                 }
    
                 onSelected: {
                   if(!radio1.checked) radio1.toggle()
                 }
               }
    
               AppListItem {
                 text: "Second Option"
                 showDisclosure: false
    
                 leftItem: AppRadio {
                   id: radio2
                   value: "Option 2"
                   anchors.verticalCenter: parent.verticalCenter
                 }
    
                 onSelected: {
                   if(!radio2.checked) radio2.toggle()
                 }
               }
    
               AppListItem {
                 text: "Third Option"
                 showDisclosure: false
                 lastInSection: true
    
                 leftItem: AppRadio {
                   id: radio3
                   value: "Option 3"
                   anchors.verticalCenter: parent.verticalCenter
                 }
    
                 onSelected: {
                   if(!radio3.checked) radio3.toggle()
                 }
               }
    
               SimpleSection {
                 title: "Checkboxes"
               }
    
               AppListItem {
                 text: "First Option"
                 showDisclosure: false
    
                 rightItem: AppCheckBox {
                   id: checkBox1
                   anchors.verticalCenter: parent.verticalCenter
                 }
    
                 onSelected: {
                   checkBox1.checked = !checkBox1.checked
                 }
               }
    
               AppListItem {
                 text: "Second Option"
                 showDisclosure: false
    
                 rightItem: AppCheckBox {
                   id: checkBox2
                   checked: true
                   anchors.verticalCenter: parent.verticalCenter
                 }
    
                 onSelected: {
                   checkBox2.checked = !checkBox2.checked
                 }
               }
    
               AppListItem {
                 text: "Third Option"
                 showDisclosure: false
                 lastInSection: true
    
                 rightItem: AppCheckBox {
                   id: checkBox3
                   anchors.verticalCenter: parent.verticalCenter
                 }
    
                 onSelected: {
                   checkBox3.checked = !checkBox3.checked
                 }
               }
             }
           }
         }
       }
     }
  • You can now add a "Sign in with Apple" button to your app using the Apple Sign In Plugin, to comply with Apple's guideline to provide an Apple signup option along with other social signup options.

    This plugin offers you 2 new components AppleSignIn and AppleSignInButton to handle signing in with an Apple ID. Here is an example usage:

     import QtQuick
     import Felgo
    
     App {
       NavigationStack {
         Page {
           title: "Apple Sign In"
    
           Column {
             anchors.centerIn: parent
             spacing: dp(15)
    
             AppleSignInButton {
               id: appleSignInButton
               anchors.horizontalCenter: parent.horizontalCenter
             }
    
             AppText {
               anchors.horizontalCenter: parent.horizontalCenter
               text: !appleSignInButton.enabled
                     ? "Apple Sign-in unavailable."
                     : appleSignInButton.appleSignIn.isLoggedIn
                     ? "Signed in: " + appleSignInButton.appleSignIn.userName
                     : "Click above to sign in with Apple user"
             }
           }
         }
       }
     }
  • Felgo Cloud Builds now supports building for desktop platforms (Windows, macOS, Linux). As result of the builds, you get zip files containing ready to use executables. Additionally you can upload signing data to sign Mac and Windows executables.

New Features

  • On iOS and Android, you can now make use of the native Keychain/KeyStore to store, read and delete data securely and persistent. Writing and reading of such values is straightforward using the Felgo NativeUtils:
     import Felgo
     import QtQuick
    
     App {
    
       AppButton {
         text: "Store in Keychain"
         onClicked: NativeUtils.setKeychainValue("identifier", "value")
       }
    
       AppButton {
         text: "Read Keychain"
         onClicked: NativeUtils.getKeychainValue("identifier")
       }
    
       AppButton {
         text: "Delete from Keychain"
         onClicked: NativeUtils.clearKeychainValue("identifier")
       }
     }
  • NativeUtils::share() now lets you share images and other files with other apps. Calling this function with a file url, e.g. an image, will open the share dialog with the appropriate options for the file type:

  • The Android theme now offers a proper default style for bottom tab navigation. By default, Android will still use a navigation drawer, so if you want to use the bottom tabs navigation, you need to set the Navigation::navigationMode property accordingly.

    Here is an example:

     import QtQuick
     import Felgo
    
     App {
       Navigation {
         // Use tabs on Android, else default (which is tabs on iOS and drawer on desktop)
         navigationMode: Theme.isAndroid ? navigationModeTabs : navigationModeDefault
         // On Android, only the selected label is shown by default. You can change that by accessing the internal tabs or using the theming
         //tabs.showOnlySelectedLabel: false // can also be changed with Theme.navigationTabBar.showOnlySelectedLabel
    
         NavigationItem {
           title: "First"
           icon: IconType.heart
    
           NavigationStack {
             Page {
               title: "First Page"
             }
           }
         }
    
         NavigationItem {
           title: "Second"
           icon: IconType.book
    
           NavigationStack {
             Page {
               title: "Second Page"
             }
           }
         }
    
         NavigationItem {
           title: "Third"
           icon: IconType.bolt
    
           NavigationStack {
             Page {
               title: "Third Page"
             }
           }
         }
       }
     }

    The new bottom tab navigation replaces the top tab navigation if used with the Navigation component. You can still create the top tabs (also known as "segments") using the AppTabBar component.

    You can change the theming values of the bottom tab navigation on all platforms using the new Theme.navigationTabBar. Note that this was previously done using Theme.tabBar, you can find details about this theming change in the list of improvements below.

  • You can now use the new AppRadio control for radio selections in your apps. This control is based on the Qt Quick Controls 2 RadioButton, and adds proper default styling for use across various platforms. It allows you to follow native platform guidelines more easily, to provide your users with a familiar experience.

    Here is an example of how to use the new control, and how it can be combined with the new AppListItem for a native UI/UX:

     import QtQuick
     import QtQuick.Controls as QC2
     import Felgo
    
     App {
       NavigationStack {
         Page {
           title: "AppRadio"
           backgroundColor: Theme.secondaryBackgroundColor
    
           Column {
             width: parent.width
    
             SimpleSection {
               title: "As list items: " + ratioButtonGroup1.checkedButton.value + " selected"
             }
    
             QC2.ButtonGroup {
               id: ratioButtonGroup1
               buttons: [radio1, radio2, radio3]
             }
    
             AppListItem {
               text: "First Option"
               showDisclosure: false
    
               leftItem: AppRadio {
                 id: radio1
                 checked: true
                 value: "Option 1"
                 anchors.verticalCenter: parent.verticalCenter
               }
    
               onSelected: {
                 if(!radio1.checked) radio1.toggle()
               }
             }
    
             AppListItem {
               text: "Second Option"
               showDisclosure: false
    
               leftItem: AppRadio {
                 id: radio2
                 value: "Option 2"
                 anchors.verticalCenter: parent.verticalCenter
               }
    
               onSelected: {
                 if(!radio2.checked) radio2.toggle()
               }
             }
    
             AppListItem {
               text: "Third Option"
               showDisclosure: false
               lastInSection: true
    
               leftItem: AppRadio {
                 id: radio3
                 value: "Option 3"
                 anchors.verticalCenter: parent.verticalCenter
               }
    
               onSelected: {
                 if(!radio3.checked) radio3.toggle()
               }
             }
    
             SimpleSection {
               title: "Inline: " + ratioButtonGroup2.checkedButton.value + " selected"
             }
    
             QC2.ButtonGroup {
               id: ratioButtonGroup2
               buttons: [radio4, radio5]
             }
    
             Rectangle {
               width: parent.width
               height: contentCol.height
    
               Column {
                 id: contentCol
                 width: parent.width
                 padding: dp(Theme.contentPadding)
    
                 AppRadio {
                   id: radio4
                   value: "Option 1"
                   text: "First Option"
                   checked: true
                 }
    
                 AppRadio {
                   id: radio5
                   value: "Option 2"
                   text: "Second Option"
                 }
               }
             }
           }
         }
       }
     }
  • The AppButton now allows setting icons left and right of the text. Also some other customizations now got easier to apply.

     import QtQuick
     import Felgo
    
     App {
       NavigationStack {
         Page {
           title: "AppButton"
    
           Column {
             width: parent.width
    
             AppButton {
               text: "Icon"
               flat: false
               icon: IconType.heart
             }
    
             AppButton {
               text: "Left Icon"
               flat: false
               iconLeft: IconType.heart
             }
    
             AppButton {
               text: "Right Icon"
               flat: false
               iconRight: IconType.heart
             }
    
             AppButton {
               id: customButton
               text: "Custom left item"
               flat: false
               leftItem: Rectangle {
                 width: dp(15)
                 height: width
                 rotation: 45
                 color: "green"
                 // Handling the pressed state on iOS in the custom item
                 opacity: Theme.isIos && customButton.pressed ? 0.5 : 1
               }
             }
    
             AppButton {
               text: "Full width"
               flat: false
               width: parent.width
               iconRight: IconType.heart
             }
    
             AppButton {
               text: "Circle"
               flat: false
               icon: IconType.heart
               height: width
               radius: width/2
             }
           }
         }
       }
     }

Improvements

  • This update fixes a semantic inconsistency in the theming. Both the main bottom tab navigation (using Navigation) as well as the general tabs (using AppTabBar) shared the same theme, accessible with Theme.tabBar. This resulted in potential issues when using both controls at the same time, but trying to apply different theming. With the introduction of a new style for a bottom tab navigation on Android (see detailed change above), we also split up the themes properly. You can now use Theme.navigationTabBar to style your bottom tab navigation and Theme.tabBar to style general tabs.

    For migrating existing projects that already apply theming to the bottom navigation using Theme.tabBar, simply replacing it with Theme.navigationTabBar should be sufficient.

     import Felgo
    
     App {
       onInitTheme: {
         // Replace tabBar with navigationTabBar to style the bottom tab navigation
         //Theme.tabBar.titleColor = "red"
         Theme.navigationTabBar.titleColor = "red"
       }
     }
  • NativeUtils::safeAreaInsets is now better supported on Android. You can also use the new property Theme::safeAreaTop. It handles proper layouting in combination with Theme::statusBarStyle.
  • The PullToRefreshHandler can now also be used with AppFlickable or FlickablePage items.
     import QtQuick
     import Felgo
    
     App {
       NavigationStack {
         Page {
           title: "Pull to refresh"
    
           rightBarItem: ActivityIndicatorBarItem {
             visible: refreshSimulator.running
           }
    
           Timer {
             id: refreshSimulator
             interval: 1500
           }
    
           AppFlickable {
             id: flickable
             anchors.fill: parent
             contentWidth: width
             contentHeight: column.height
    
             Column {
               id: column
               width: parent.width
    
               Repeater {
                 model: 30
                 AppListItem {
                   text: "Item " + index
                 }
               }
             }
    
             PullToRefreshHandler {
               listView: flickable
               onRefresh: {
                 refreshSimulator.restart()
               }
             }
           }
         }
       }
     }
  • You can now change the AppTextField underline color on Android easier using the AppTextField::underlineColor property.
  • You can now customize the look and feel of a single NavigationBar component, independently of the global theme, with all visual properties also added to the component API. You can access the NavigationBar of a NavigationStack with the NavigationStack::navigationBar property.
  • Several improvements to the Felgo Hot Reload GUI application and QML Hot Reload in general are applied with this update.

    This includes:

    • More efficient transfer of source-code changes
    • Improved handling of log output in the Felgo Hot Reload GUI to prevent UI stalling
    • Avoid of UI freeze while transferring big projects to the Hot Reload Client
    • Improved handling of z-index with QML Hot Reload
    • Prevent potential crashes when using WebStorage with QML Hot Reload
    • Visual improvements to Felgo Hot Reload GUI controls

Fixes

  • Fixes a potential crash during app shutdown when using multi-threading.
  • Fixes auto-completion information for the AppCheckBox component in Qt Creator.
  • Fixes a compile-time issue when using Xcode 12 (or newer) to build apps for iOS.

v 3.6.0 (2020-06-17)

Highlights Blog Post: Release 3.6.0: Modal Dialog and iOS Storyboard Support for Qt & Felgo

Felgo 3.6.0 adds the new AppModal component to display modal dialogs in your apps. You can use this component for both full-screen and custom-height modal dialogs. On iOS, you can now use Storyboard files to create your app launch screen. This update also adds new components and several improvements and fixes.

Felgo 3.6.0 comes as a free update for all Felgo developers.

Update Now (New to Felgo? Get started here)

Felgo 3.6.0 Migration Hints

This update contains important migration hints for Felgo projects created with earlier versions of the Felgo SDK.

  • The iOS framework files of Firebase, AdMob and Chartbosst got updated. Please use the latest libraries as listed in the integration guide of each of those plugins. Links to the individual guides can be found lower down in this changelog, at the individual change entries.
  • iOS apps require to add the launch screen on iOS as Storyboard file beginning with July 2020. The migration steps for existing projects are listed lower down in this changelog.

Highlights

  • The AppModal can be used to display a modal sheet on top of your app. The AppModal can be used as a container for any custom content.
    iOS Android

New Features

  • You can now integrate native code and widgets directly from QML. Use the new types NativeObject and NativeView for this.
  • Felgo projects now support using a Storyboard file as launch screen on iOS. Starting July 2020, this is required for any apps published to the Apple App Store.

    Newly created projects already contain an empty launch screen file. You can change the launch screen using Xcode:

    • Build your project for iOS.
    • Open the <build-folder>/<project>.xcodeproj in Xcode.
    • Open the Launch Screen.storyboard under Bundle Data.

    You can add any default UI elements to the launch screen Storyboard.

    You can also migrate existing Felgo projects to use the new launch screen Storyboard:

    • Create a new empty Felgo app or game project with Qt Creator.
    • From the created empty project: Copy the file ios/Launch Screen.storyboard to your existing project's <project>/ios directory.
    • Delete the directory <project>/ios/Assets.xcassets/LaunchImage.launchimage.
    • Add the following lines to your <project>/ios/Project-Info.plist, inside the <dict> tag:
       <key>UILaunchStoryboardName</key>
       <string>Launch Screen</string>
    • You can now add your launch screen UI (splash screen images, ...) with Xcode as described above.
  • The new VersionCheckLoader and VersionCheckDialog items provide a convenient way to notify users about updates for your app.

Improvements

  • The Felgo Hot Reload GUI now includes a hint for the Felgo Hot Reload Module, that you need to use if your project contains any custom C++ code. With the Felgo Hot Reload module, you can use QML Hot Reload together with your custom C++ code.

  • The Firebase Plugin now uses Firebase SDK version 6.26.0 for all Firebase features on iOS.

    Note: For existing apps, make sure to add and update all the required frameworks listed in Integration Guide.

  • The AdMob Plugin now uses the latest GoogleMobileAds SDK version 7.60.0 on iOS.

    Note: This new version requires new integration steps.

    • Copy the new frameworks GoogleMobileAds, GoogleAppMeasurement, GoogleUtilities, nanopb and FBLPromises from PluginDemo/ios to your project/ios directory.
    • Add your AdMob app ID to your ios/Project-Info.plist:
       <key>GADApplicationIdentifier</key>
       <string>ca-app-pub-(your-app-id)</string>

    For more information, see the Integration Guide.

  • The Chartboost Plugin now uses Chartboost SDK version 8.1.0 on iOS and version 8.0.3 on Android. With those versions, Chartboost no longer supports Chartboost::showMoreApps() and related methods.

    Note: For existing apps, make sure to add and update all the required frameworks listed in Integration Guide.

    This update also requires additional migration steps for this plugin:

    Add the following repository to the allprojects -> repositories node:

    
                    

    Add the following code as child of the android node, before the defaultConfig node:

     compileOptions {
       sourceCompatibility 1.8
       targetCompatibility 1.8
     }
  • The clear button shown with AppTextField::showClearButton now is more reliable and also resets predictive text input when clicked.
  • The Felgo Hot Reload Server now properly reports files changed outside of Qt Creator on Windows.
  • Felgo QML Hot Reload now properly handles changes in QML Grouped Properties.
  • Fixes a potential crash with the AdMob Plugin when using an AdMobBanner inside a NavigationStack.

Fixes

v 3.5.0 (2020-04-22)

Highlights Blog Post: Release 3.5.0: Run your Qt and Felgo Apps in the Browser with WebAssembly (WASM)

Felgo 3.5.0 adds support for WebAssembly (WASM) as a new export platform. This allows you to use Felgo and Qt to build applications that also run in the browser, served over the web. With this update you get access to a new target platform, with the same source code and skills you already used to develop mobile, desktop and embedded apps with Felgo and Qt.

Felgo 3.5.0 comes as a free update for all Felgo developers.

Update Now (New to Felgo? Get started here)

Highlights

  • This update adds support for WebAssembly (WASM), to target the web as additional platform. Deployment information can be found in the documentation at Deploying Felgo Apps to the Web

    With Felgo for WebAssembly, you get an improved version of the Qt WASM port, with several fixes and additional features. You can find a detailed list of the improvements, and much more information about WASM, in the release blog post. You can also use Felgo for WebAssembly with plain Qt applications, that do not include any Felgo components, to benefit from the improvements.

New Features

  • Updates to Qt Creator 4.11.2 with many improvements and better stability, for a better development experience.
  • The new FpsMeter component allows you to spot drops in framerate of your app or game and thus identify parts of the UI with bad performance across all platforms or test devices.

     import Felgo
     import QtQuick
    
     App {
       id: app
    
       Page {
         // ... UI items go here ...
       }
    
       // Simply place the FpsMeter on top of other UI elements, no additional
       // configuration is required as all properties are set to sensible defaults.
       FpsMeter {
       }
    
     }
  • The new method NativeUtils::deviceManufacturer() provides information about the mobile device manufacturer.

Improvements

  • The Amplitude Plugin can now be used on Desktop and embedded, in addition to Android and iOS.

    Note that the Amplitude plugin will now also send events during development on desktop by default. If that is not desired, make sure to remove the apiKey during development, or e.g. check if system.publishBuild is set.

  • Felgo QML Hot Reload now supports the QML "on"-Syntax. You can add Property Value Sources like PropertyAnimation on x and Property Value Interceptors like Behavior on x at runtime using Hot Reloading.
  • App::storeWindowGeometry and GameWindow::storeWindowGeometry will now also work for publish builds if set to true. This allows restoring the last window size and position of the app on app start. This property should only be used on desktop.

Fixes

v 3.4.0 (2020-03-18)

Highlights Blog Post: Release 3.4.0: QML Hot Reload with Felgo Live

Felgo 3.4.0 adds hot reloading for QML. This is a major improvement of code reloading, further speeding up development speed with Felgo and Qt.

Felgo 3.4.0 comes as a free update for all Felgo developers.

Update Now (New to Felgo? Get started here)

Highlights

  • Felgo QML Hot Reload. Find all the important info about hot reloading your QML code with Felgo and Qt applications here: Felgo QML Hot Reload

    Hot Reload allows you to change your QML & JavaScript source code and view the result in realtime. It applies QML, JavaScript and asset changes instantly on every connected device, immediately after saving. This reduces the long waiting times for build and deployment steps to only a couple of seconds.

    Hot Reload applies changes in your source code without losing the state of your application. If you are currently working on a sub page, you will not have to navigate back to it after every change, you will stay exactly where you are in your app.

    Learn more in the official docs here.

New Features

Improvements

  • NativeUtils::contacts now contains more information about contacts. The new information includes postal addresses, email addresses, company name and phone number types.
  • The Facebook Plugin now supports the native SDK v5.13.0 on iOS.
  • Examples now use the latest project format of Felgo, which allows you to provide more configuration values, like the license key, from your *.pro file.

Fixes

  • NativeUtils::displayImagePicker() no longer leaves behind a temporary file on iOS.
  • Fixes the Deprecated API Usage warning for UIWebView when uploading an app to the Apple Store.
  • Fixes an Android SSL version issue while building, which previously required you to apply a hotfix.
  • Fixes a crash with the OneSignal requestTags method.
  • Fixes an issue with Android 10 API blacklisting.

v 3.3.0 (2019-12-04)

Highlights Blog Post: Release 3.3.0: Update to Qt 5.13.2 and Qt Creator 4.10.2, Jira Tima App Demo

Felgo 3.3.0 adds support for Qt 5.13.2 and Qt Creator 4.10.2, which brings many features and improvements. This update also adds many new APIs, improvements and fixes to the Felgo components.

Felgo 3.3.0 comes as a free update for all Felgo developers.

Update Now (New to Felgo? Get started here)

Felgo 3.3.0 Migration Hints

  • The new Qt version 5.13.2 requires an increase of the minimum and target SDK versions in the AndroidManifest.xml file of your projects. The new versions are android:minSdkVersion="21" and android:targetSdkVersion="28".

Android Hotfix

If you plan to target devices running Android 5, please download this file and overwrite the existing file in <Path to Felgo installation>\Felgo\android_armv7\mkspecs\features\, as well as <Path to Felgo installation>\Felgo\android_arm64_v8a\mkspecs\features\. Also rename the following files in both <Path to Felgo installation>\Felgo\android_armv7\lib\ and <Path to Felgo installation>\Felgo\android_arm64_v8a\lib\:

  • libcrypto.so --> libcrypto_1_1.so
  • libssl.so --> libssl_1_1.so

If you use the OneSignal plugin requestTags method, please replace your maven import URL in the build.gradle file, located in the android folder of your project directory, so it looks like this:

 maven { url 'https://install.felgo.com/maven/' }

Facebook iOS Hotfix

With Felgo 3.3.0, you need an additional line in your *.pro file, to use the Facebook plugin with iOS. The integration will look like this:

 FELGO_PLUGINS += facebook

 ios {
   LIBS += -framework Accelerate
 }

You can find more information in the plugin integration guide.

Highlights

  • New Social Network App

    This demo shows best practices for UI design with a shared code-base across Android, iOS and desktop. It works with dummy data based on the Jira time tracking software. It uses several of the latest APIs released with Felgo 3.3.0.

    It is based on the official Jira Tima mobile app developed by Felgo.

iOS Android Desktop

  • The desktop theme now features hover effects and uses the mouse pointer cursor for all input elements as well as the RippleMouseArea. You also have new styling options for the main navigation on desktop, which are listed in the "New Features" section of this release.
  • The Dialog and InputDialog components now have a new material style on Android. They can also be further customized with the new ThemeDialog properties.
     import QtQuick
     import Felgo
    
     App {
    
       onInitTheme: {
         // You can add custom styles for dialogs now
         //Theme.dialog.backgroundColor = "yellow"
         dialog.open()
       }
    
       NavigationStack {
         Page {
           title: "Dialog"
         }
       }
    
       Dialog {
         id: dialog
         title: "Do you think this is awesome?"
         autoSize: true
         positiveActionLabel: "Yes"
         negativeActionLabel: "No"
         onCanceled: title = "Think again!"
         onAccepted: close()
    
         // You can use Theme.dialog.defaultContentPadding to align your
         // custom content with the rest of the dialog UI.
         AppText {
           padding: dp(Theme.dialog.defaultContentPadding)
           wrapMode: Text.WordWrap
           width: parent.width
           text: "This is a very long sentence to get some line breaks in this content!"
           // Colors and alignment are platform depending for the best appearance
           color: Theme.isIos ? Theme.colors.textColor : Theme.colors.secondaryTextColor
           horizontalAlignment: Theme.isIos ? Text.AlignHCenter : Text.AlignLeft
         }
       }
     }

    You can now also access the title item with Dialog::titleItem alias as well as manually set Dialog::titleDividerVisible.

  • AppTextField is now based on Qt Quick Controls 2 and offers several new APIs.
  • With the new AppTextField::inputMode property, you can use a set of predefined input modes for different types of text fields:
     import QtQuick
     import Felgo
    
     App {
       NavigationStack {
         Page {
           title: "AppTextField::inputMode"
    
           AppTextField {
             width: parent.width
             inputMode: inputModeEmail
           }
         }
       }
     }

    You can find details on other new properties like AppTextField::passwordVisible and AppTextField::showPasswordVisibleButton in the associated documentation.

    Note: This also applies to SearchBar which uses an AppTextField internally.

  • The AppTextField::clickEnabled property is used for text fields without manual input. When the user selects this text field, the AppTextField::clicked signal is fired instead of setting focus to the text field. This makes sense e.g. for date input fields, where you can show a date picker when the field is selected.
     import QtQuick
     import Felgo
    
     App {
       NavigationStack {
         Page {
           title: "AppTextField::clickEnabled"
    
           AppTextField {
             id: textField
             width: parent.width
             placeholderText: "Select date"
             clickEnabled: true
             onClicked: {
               NativeUtils.displayDatePicker()
             }
    
             Connections {
               target: NativeUtils
               onDatePickerFinished: {
                 if(accepted) textField.text = date
               }
             }
           }
         }
       }
     }
  • New component TextFieldRow to construct basic input forms on pages. It displays a label based on AppText together with a text field based on AppTextField.
     import QtQuick
     import Felgo
    
     App {
       NavigationStack {
         Page {
           title: "TextFieldRow"
    
           Column {
             id: column
             width: parent.width
    
             TextFieldRow {
               width: parent.width
               label: "Text"
               placeHolder: "Add some text"
             }
    
             TextFieldRow {
               id: dateRow
               width: parent.width
               label: "Date"
               placeHolder: "Select date"
               clickEnabled: true
               onClicked: {
                 NativeUtils.displayDatePicker()
               }
    
               Connections {
                 target: NativeUtils
                 onDatePickerFinished: {
                   if(accepted) dateRow.value = date
                 }
               }
             }
           }
         }
       }
     }
  • The new Theme::contentPadding property helps you streamline your layouts easier and match your content paddings with the overall app layout.

    Note: This property must be used with dp().

New Features

Improvements

Fixes

v 3.2.0 (2019-05-14)

Highlights Blog Post: Release 3.2.0: Update to Qt 5.12.3 with ECMAScript 7, Image Picker and Qt Creator 4.8.2

Felgo 3.2.0 adds support for Qt 5.12.3 and Qt Creator 4.8.2, which brings many features and improvements. The new long term supported Qt release includes lots of fixes, new modules and adds JavaScript support for ECMAScript 7. The updated Felgo IDE Qt Creator version 4.8.2 is more stable and adds compatibility with the latest toolchains and platforms.

Felgo 3.2.0 comes as a free update for all Felgo developers.

Update Now (New to Felgo? Get started here)

Migration Hints

This update contains important migration hints for Felgo projects created with earlier versions of the Felgo SDK.

  • Changed Android minimum NDK version The Android Build Kit now uses the Clang compiler instead of GCC, which got removed with NDK r18b. Thus, older NDK versions are no longer supported and we recommend to upgrade to NDK r19c. You can download it here.

    Please see the Android deployment guide if you are not sure how to install and use the new NDK.

    We also recommend to delete the old shadow build folders and perform a clean/qmake of your project, to avoid Android build caching issues. You can find the shadow build folder path in the Projects tab of Qt Creator.

  • If you get build issues on Android, similar to No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el, please update your gradle version to com.android.tools.build:gradle:3.6.0. You can find this version if you open android/build.gradle in your project folder. You can find more info in the Gradle Build System guide.
  • Additional iOS libs for In-App Purchase plugin With this update, you need to add additional files for iOS, if you use the in-app purchase plugin. Please check out the integration guide to see where you can find those files.
    • libSoomlaiOSStore.a
    • libKeeva.a
    • libcrypto.a
    • libssl.a
    • AppleIncRootCertificate.cer

Highlights

  • Update to Qt 5.12.3 - Long Term Supported Release

    Qt 5.12.3 is the third patch version for Qt 5.12 LTS, which is a long-term-supported release. It incorporates more than 2000 bugs fixes since the previous Qt LTS version, Qt 5.9.7. On top of Qt 5.12.3, the new LTS version will receive many patch releases throughout the coming years. The latest Qt 3D Studio version is based on Qt 5.12 LTS as well.

  • QML Engine Improvements and JavaScript Support for ECMAScript 7

    QML performance and memory consumption improved a lot over the previous Qt versions. Memory usage with Qt 5.12 is 30% lower than with Qt 5.9, the previous LTS version. Qt focuses a lot on improving the QML engine performance, you can read more about Qt 5.12 performance improvements here.

    With the new release, you can also take advantage of major improvements to the JavaScript engine that supports QML. Previously compatible with ECMAScript 5, it now fully supports ECMAScript 7. This allows the usage of modern JavaScript and simplifies the integration of Javascript libraries. ECMAScript modules are now also supported and can be loaded both from C++ as well as QML/JS.

  • Qt Creator 4.8.2: Improved Android Compatibility and Better iOS Device Support

    Along with the Qt 5.12.3 update, Felgo 3.2.0 also presents you with Qt Creator 4.8.2. The new IDE version is more stable and adds support for the latest build tools and platforms.

    On iOS, the IDE now better detects later iPhone models like the iPhone XS. The update also includes many improvements and fixes for macOS Mojave.

    For Android, you can now connect and use the debugger on API level 24 and later. The new Qt Creator is also fully compatible with Android SDK 28.

    Note: The Android Build Kit now uses the Clang compiler instead of GCC, which got removed with NDK r18b. Thus, older NDK versions are no longer supported and we recommend to upgrade to NDK r19c. You can download it here.

    Make sure to configure the new NDK in the Qt Creator settings for Android:

    Before you can build projects, we also recommend to clean previous build folders and project settings:

    • Close Qt Creator
    • Delete the *.pro.user file of your project
    • Remove the previous project build folder
    • Open your project in Qt Creator and choose your Build Kits
    • Rebuild your project for Android

    Qt 5.12 and Qt Creator 4.8 also add basic support for the Android ARMv8 architecture. However, there are no pre-built libraries for this architecture with Felgo 3.2.0 yet. If you require early access to Felgo Android ARMv8 support, don’t hesitate to get in touch.

    On Windows, Qt Creator does no longer force the use of ANGLE for OpenGL on user applications. You can also expect less issues with antivirus programs on Windows systems. Read more about the bigger improvements of Qt Creator 4.8 in the official release post.

  • Set License Key in Your Project Configuration

    You can now set your Felgo license key as configuration variable from your project file. The Felgo project configuration now supports the PRODUCT_LICENSE_KEY settings:

     CONFIG += felgo
    
     # Optionally set a license key that is used instead of the license key from
     # main.qml file (App::licenseKey for your app or GameWindow::licenseKey for your game)
     PRODUCT_LICENSE_KEY = ""

    New projects created with the Qt Creator wizards use this setup by default. If you want to update your existing project, add the following line of code to your main.cpp file right below the felgo.initialize() method:

     // Set an optional license key from project file
     // This does not work if using Felgo Hot Reload, only for Felgo Cloud Builds and local builds
     felgo.setLicenseKey(PRODUCT_LICENSE_KEY);

    Setting the license key from within the project file with PRODUCT_LICENSE_KEY requires you to do a full rebuild (clean) of your project.

    Note: Setting the license key with PRODUCT_LICENSE_KEY is not possible if using the Felgo Hot Reload Client. Felgo Hot Reload Client still picks up the license key set with App::licenseKey for your app or GameWindow::licenseKey for your game.

    For more information, have a look at our publishing guide section about the license key.

  • Add Subscriptions for iOS and Android to your Apps and Games

    The in-app purchase plugin now supports subscriptions for iOS and Android apps. Today, subscriptions are the best way to monetize your app, offering recurring revenue from your users. Also Apple and Google only take a 15% share on subscriptions after 1 year, compared to the 30% share for regular in-app purchases, so that is another plus!

    If you want to use subscriptions or the built-in virtual economy system, we recommend using the Felgo in-app purchase plugin instead of the default Qt Purchasing module.

    Note: With this update, you need to add additional files for iOS, if you use the in-app purchase plugin. Please check out the integration guide to see where you can find those files.

    • libSoomlaiOSStore.a
    • libKeeva.a
    • libcrypto.a
    • libssl.a
    • AppleIncRootCertificate.cer

New Features

  • The new ImagePicker control allows to choose multiple images from the device gallery in one go. It uses a custom QML GridView, which accesses photos from the device gallery or camera roll.
     import Felgo
     import QtQuick
    
     App {
       NavigationStack {
         Page {
           id: page
           title: qsTr("Choose Photos")
    
           // right bar item to accept selection
           rightBarItem: TextButtonBarItem {
             text: "Next"
             enabled: imagePicker.selectedCount > 0
    
             // your app will probably pop the photo selection page from the stack to move on
             // this example only logs the selected photos
             onClicked: console.debug("SELECTED:", JSON.stringify(imagePicker.selection))
           }
    
           // image picker view for photo selection
           ImagePicker {
             id: imagePicker
             anchors.fill: parent
           }
         }
       }
     }

    You can also build your own UI for picking photos. Call NativeUtils::fetchGalleryPhotos() to load a list of all device photos, which your view can then access with the NativeUtils::galleryPhotos property. To further work with individual images, use NativeUtils::getCachedAssetPath().

  • Improved Qt Quick Controls 2 and TableView

    The update to Qt 5.12.3 adds several more new features. You can now use the TableView as another type of Item View in Qt Quick. It is similar to a ListView but with multiple columns. Unlike the previous implementation of QtQuick Controls 1, it does not do any styling. The TableView provides the optimal solution for instantiating, pooling and reusing delegates on demand as you scroll the table. A TableModel for the view can be created with a custom C++ QAbstractTableModel implementation.

    Also, various controls in Qt Quick Controls 2 gained new methods or new functionalities.

  • Qt Quick Input Handlers

    The Pointer Handlers of Qt 5.11 are now renamed to Input Handlers and are fully supported as a first-class feature in Qt Quick. The Input Handlers simplify the creation of complex touch interactions, that used to be difficult to do with MouseArea and TouchArea alone. They can detect events even in cases of deep nesting.

    This also applies for the TapHandler, which can detect taps and touch gestures. Unlike MouseArea, it can handle events in multiple nested Items at the same time:

     import QtQuick
     import Felgo
    
     App {
      NavigationStack {
        Page {
          title: "Nested Touch Example"
    
          // Outer Rectangle
          Rectangle {
            anchors.centerIn: parent
            id: outerRect
            width: dp(200)
            height: dp(200)
            color: tapHandler.pressed ? "lightyellow" : "lightgreen"
    
            TapHandler {
              id: tapHandler
            }
    
            // Inner Rectangle
            Rectangle {
              id: innerRect
              anchors.centerIn: parent
              width: dp(75)
              height: dp(75)
              color: tapHandler2.pressed ? "lightblue" : "orange"
    
              TapHandler {
                id: tapHandler2
              }
            }
          }
    
        }
      }
     }

    It is also easy to make an Item draggable with the DragHandler.

     import QtQuick
     import Felgo
    
     App {
       NavigationStack {
         Page {
           title: "Drag Example"
    
           // Draggable Rectangle
           Rectangle {
             // initial position
             x: (parent.width - width) / 2
             y: (parent.height - height) / 2
    
             width: dp(200)
             height: dp(100)
             color: dragHandler.active ? "lightyellow" : "lightgreen"
    
             AppText {
               id: text
               text: "Drag Me!"
               anchors.centerIn: parent
             }
    
             DragHandler { id: dragHandler }
           }
    
         }
       }
     }

    HoverHandler was added as a new type of handler for detecting mouse hover. As touchscreens generally do not offer hover events, in practice it detects a hovering mouse or tablet stylus.

  • DelegateChooser Tech Preview and More

    As a new tech preview, you can have a look at the DelegateChooser type. It allows to use different delegates in item views like AppListView. Depending on role values from the model or the index, you can choose between multiple delegates:

     import QtQuick
     import Felgo
    
     import Qt.labs.qmlmodels // tech preview import
    
     App {
       NavigationStack {
         Page {
           title: "Multiple Delegates"
    
           AppListView {
             anchors.fill: parent
             model: [
               {
                 text: "Apple",
                 detailText: "A delicious fruit with round shape",
                 type: "fruit"
               },
    
               {
                 text: "Beer",
                 type: "drink"
               },
    
               {
                 text: "Orange",
                 detailText: "Another fruit with round shape",
                 type: "fruit"
               },
    
               {
                 text: "Wine",
                 type: "drink"
               }
             ]
    
             delegate: DelegateChooser {
               role: "type"
    
               DelegateChoice {
                 roleValue: "fruit"
    
                 // Delegate for "fruit" type
                 SimpleRow {
                   onSelected: text = "Clicked"
                 }
               }
    
               DelegateChoice {
                 roleValue: "drink"
    
                 // Delegate for "drink" type
                 Rectangle {
                   width: parent.width
                   height: dp(50)
    
                   color: Theme.tintColor
    
                   AppText {
                     x: dp(16)
                     anchors.verticalCenter: parent.verticalCenter
                     text: modelData.text
                     color: "white"
                   }
                 }
               }
             }
           }
    
         }
       }
     }

    There are many more additions you get with Qt 5.12.3, for example:

    Also note that the following modules are part of the Qt 5.12 release, but are deprecated and considered for removal in subsequent releases of Qt:

    You can also have a look at the official Qt 5.12 blog post or see the full list of changes here.

Improvements

Fixes

v 3.1.0 (2019-02-20)

Highlights Blog Post: Release 3.1.0: New Felgo Plugins Version, Unified App Configuration and FlickablePage

Felgo 3.1.0 introduces a new base version for Felgo Plugins and simplifies maintenance with a unified app configuration for Desktop, iOS and Android.

Felgo 3.1.0 comes as a free update for all Felgo developers.

Highlights

  • New Version 3 for Felgo Plugins on Android

    To match the new Felgo SDK version 3, the version for Felgo Plugins now also increased to 3. This version change is relevant when building your project for the Android platform. You will notice that the configured plugin dependencies in the android/build.gradle of your project are no longer supported.

    To correctly integrate the latest Felgo Plugins in your project, please update the build.gradle configuration to use version 3 of the plugins. For example: To use the AdMob Plugin on Android add

     implementation 'net.vplay.plugins:plugin-admob:3.+'

    instead of

     implementation 'net.vplay.plugins:plugin-admob:2.+'

    to the dependencies block of your build.gradle. Note that the version setting at the end of the line changed to 3.+. The same pattern applies to all other plugin integrations. You can also see the updated integration guide in the Felgo Plugins Documentation.

    With this change the Android configuration of your app is correctly set up to use the latest version of Felgo Plugins.

  • Set Product Identifier and Version in Your Project Configuration

    The PRODUCT_IDENTIFIER, PRODUCT_VERSION_CODE and PRODUCT_VERSION_NAME project settings are now fully supported on iOS, Android and Desktop.

    The app identifier and version of your app usually requires to be specified at many different places. For example at the qml/config.json on Desktop, or the AndroidManifest.xml or Project-Info.plist for mobile platforms.

    With this release, you can specify the relevant values with a single configuration for all platforms. The Felgo project configuration now supports the PRODUCT_IDENTIFIER, PRODUCT_VERSION_CODE and PRODUCT_VERSION_NAME settings:

     CONFIG += felgo
    
     # configure the identifier and version information
     PRODUCT_IDENTIFIER = net.felgo.demos.FelgoProject
     PRODUCT_VERSION_NAME = 1.0.0
     PRODUCT_VERSION_CODE = 1

    New projects created with the Qt Creator wizards use this setup by default. If you want to update your existing projects to this system, also add the relevant placeholders to your Project-Info.plist:

     <key>CFBundleIdentifier</key>
     <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
     <key>CFBundleShortVersionString</key>
     <string>${PRODUCT_VERSION_NAME}</string>
     <key>CFBundleVersion</key>
     <string>${PRODUCT_VERSION_CODE}</string>

    Otherwise, the project variables are not used on iOS. For Android, you can modify your build.gradle configuration to also use the specified project settings:

     android {
         defaultConfig {
           applicationId = productIdentifier
           versionCode = productVersionCode.toInteger()
           versionName = productVersionName
         }
     }

    For Desktop platforms no additional steps are required. Each time you run qmake for your project, the values are updated with the latest configuration on all platforms.

  • New FlickablePage Component for Felgo Apps

    Many app pages with custom content require an AppFlickable to make the content scrollable. To reduce boilerplate code, you can now use the new FlickablePage, which already contains a pre-configured AppFlickable and AppScrollIndicator:

     import Felgo
     import QtQuick
    
    
     App {
       NavigationStack {
    
         FlickablePage {
           title: "Flickable Page"
    
           // set contentHeight of flickable to allow scrolling if the content is bigger than the page height
           flickable.contentHeight: column.height
    
           // set false to hide the scroll indicator, it is visible by default
           scrollIndicator.visible: true
    
           // page content
           Column {
             id: column
             width: parent.width
    
             // fill column with 100 AppText items using Repeater
             Repeater {
               model: 100
               delegate: Rectangle {
                 width: parent.width
                 height: dp(50)
                 AppText {
                   anchors.centerIn: parent
                   text: qsTr("Item") + " " + index
                 }
               }
             }
           } // Column
    
         } // FlickablePage
    
       }
     }

    All content items of your FlickablePage get reparented to the internal AppFlickable automatically and are thus scrollable.

  • Felgo Hot Reload Icons on macOS and Linux

    It is now easier distinguish the Felgo Hot Reload Server and Felgo Hot Reload Client on macOS and Linux. The different applications now use different app icons on these systems as well:

Fixes

  • Fixes an issue that broke compatibility with the old VPLAY_PLUGINS project setting. You can now use the setting to link plugin frameworks on iOS again.

v 3.0.0 (2019-02-14)

Highlights Blog Post: Release 3.0.0: V-Play is Now Felgo - New Release & Roadmap

Felgo 3.0.0 combines all app, game and plugin types into Felgo and unifies component naming conventions.

Felgo 3.0.0 comes as a free update for all Felgo developers.

Highlights

  • Apps, Games and Plugins Combined in Felgo

    You no longer have to use different import statements when working with Felgo. The components of the V-Play Apps, V-Play Games and V-Play Plugins modules are all available with a single import Felgo statement:

     import Felgo
     import QtQuick
    
     App {
    
      // Storage, required import VPlay before
      Storage {
        id: felgoStorage
      }
    
      // NavigationStack, required import VPlayApps before
      NavigationStack {
        id: appNavStack
        initialPage: Page {
          title: "AdMob Page"
    
          // AdMob Plugin, required import VPlayPlugins before
          AdMobBanner {
            adUnitId: "ca-app-pub-3940256099942544/6300978111" // banner test ad by AdMob
            testDeviceIds: [ "<a testdevice id>" ]
            banner: AdMobBanner.Smart
    
            anchors.horizontalCenter: parent.horizontalCenter
            anchors.top: parent.top
          }
        }
      }
     }

    With many recent additions, the line between the Apps and Games SDK got less clear. For example, the Storage type is also relevant for apps but was part of the V-Play Games module. The SocialView, which is based on app components, replaced the VPlayGameNetworkView also for games, and so on.

    You can combine both app and game components in your Felgo app. The unified import for all components now further simplifies this. Felgo is still compatible with the old V-Play imports. Your existing V-Play projects still work as they used to.

    But we suggest to update your projects for Felgo as soon as you can. The V-Play modules are now deprecated and not maintained further. You can thus only get the latest features and components of future Felgo updates with the new module import.

    In case you run into troubles or face an issue after upgrading to Felgo, don’t hesitate to contact us.

  • Improved Component Names

    Especially for the V-Play Games module, many components used to have a ‘VPlay’ suffix, which is now removed. This helps to keep component names short and the code is easier to read:

     import QtQuick
     import Felgo
    
     GameWindow {
      activeScene: scene
    
      Scene {
        id: scene
    
        // previously: SpriteSequenceVPlay
        SpriteSequence {
          id: spriteseq
          defaultSource: "spritesheet.png"
    
          // previously: SpriteVPlay
          Sprite {
            name: "walk"
            frameWidth: 32
            frameHeight: 32
            frameCount: 4
            startFrameColumn: 1
            frameRate: 20
            to: {"jump":0, "walk": 1}
          }
    
          // previously: SpriteVPlay
          Sprite {
            name: "jump"
            frameWidth: 32
            frameHeight: 32
            frameCount: 4
            startFrameColumn: 5
            frameRate: 10
            to: {"walk":1}
          }
        } // SpriteSequence
    
        Row {
          spacing: dp(4)
          anchors.centerIn: parent
    
          AppButton {
            text: "walk"
            onClicked: spriteseq.jumpTo("walk")
          }
          AppButton {
            text: "jump"
            onClicked: spriteseq.jumpTo("jump")
          }
        }
    
      } // Scene
     } // GameWindow

    Note: Some of the renamed components in the V-Play SDK have colliding names with Qt components. For Example, the Qt Quick module also holds a SpriteSequence or Sprite type. Qt Creator auto-resolves the types with the imported modules in the QML file. At the moment, the most recent import gets precedence to earlier ones. The above example thus uses the Felgo SpriteSequence and Sprite types, because we import Felgo after Qt Quick.

    To avoid issues and mix-ups due to this auto-resolve, you can make sure to always use a specific module by setting a custom module identifier for the import. This is how you could use the Qt Quick types in the above example, without changing the order of imported modules:

     import QtQuick as QtQuick
     import Felgo
    
     GameWindow {
      activeScene: scene
    
      Scene {
        id: scene
    
        QtQuick.SpriteSequence {
          // ...
    
          QtQuick.Sprite {
            // ...
          }
        } // SpriteSequence
    
      } // Scene
     } // GameWindow

    This is the full list of components that previously used ‘VPlay’ suffix in their name: Scene3D, Camera, AnimatedSprite, Sprite, SpriteSequence, TexturePackerAnimatedSprite, TexturePackerSprite, TexturePackerSpriteSequence, SoundEffect and Particle.

    When you update your project to the new Felgo 3.0 import, please also make sure to use the new names for these components. The name changes only apply for the Felgo module import. Your existing project with V-Play imports is not affected and can still use the old names.

  • Renamed FelgoGameNetwork, FelgoMultiplayer and SocialView

    With the rename of V-Play to Felgo, the game network and multiplayer components got renamed as well. The VPlayGameNetwork type is now FelgoGameNetwork, and VPlayMultiplayer turned into FelgoMultiplayer.

    As the VPlayGameNetworkView and VPlayMultiplayerView are in the process of getting deprecated, they do not get the Felgo name. These types have ‘VPlay’ removed and are available as GameNetworkView and MultiplayerView. Only the SocialView will see updates and fixes in the future. It is the new default UI for social services and the preferred component to use:

     import Felgo
    
     App {
     FelgoGameNetwork {
       id: gameNetwork
       gameId: 285
       secret: "AmazinglySecureGameSecret"
       multiplayerItem: multiplayer
     }
    
     FelgoMultiplayer {
       id: multiplayer
       appKey: "dd7f1761-038c-4722-9f94-812d798cecfb"
       pushKey: "a4780578-5aad-4590-acbe-057c232913b5"
       gameNetworkItem: gameNetwork
     }
    
     SocialView {
       id: socialView
       gameNetworkItem: gameNetwork
       multiplayerItem: multiplayer
     }
     }
  • Felgo Project Configuration and FelgoApplication

    To integrate the Felgo SDK in your project, set CONFIG += felgo in your *.pro configuration:

     # allows to add DEPLOYMENTFOLDERS and links to the Felgo library and QtCreator auto-completion
     CONFIG += felgo # previously CONFIG += vplay
    
     # uncomment this line to add the Felgo Hot Reload Module and use QML code reloading with your custom C++ code
     # for the remaining steps to build a custom Hot Reload app see here: https://felgo.com/custom-code-reload-app/
     # CONFIG += felgo-live # previously CONFIG += vplay-live

    The previous CONFIG += vplay setting is still supported. For QML code reloading with custom C++ code, the CONFIG += vplay-live setting changed to CONFIG += felgo-live as well. If you use Felgo Plugins in your project, link the iOS Plugin Frameworks with the FELGO_PLUGINS configuration:

     ios {
        QMAKE_INFO_PLIST = ios/Project-Info.plist
        OTHER_FILES += $$QMAKE_INFO_PLIST
     }
    
     FELGO_PLUGINS += admob # previously: VPLAY_PLUGINS += admob

    In your main.cpp, the Felgo application and Hot Reload Client class names also got renamed:

     #include <QApplication>
     #include <QQmlApplicationEngine>
    
     #include <FelgoApplication> // previously: #include <VPlayApplication>
    
     // uncomment this line to add the Felgo Hot Reload Module and use QML code reloading with your custom C++ code
     //#include <FelgoLiveClient> // previously: #include <VPLiveClient>
    
    
     int main(int argc, char *argv[])
     {
      QApplication app(argc, argv);
      FelgoApplication felgo; // previously: VPApplication vplay;
    
      // ...
    
      // to start your project as Hot Reload Client, comment (remove) the lines "felgo.setMainQmlFileName ..." & "engine.load ...", and uncomment the line below
      //FelgoLiveClient client (&engine); // previously: VPLiveClient client (&engine);
    
      return app.exec();
     }

    Similar to other changes of this update, the previous class names and includes are still supported as well.

  • Deprecated Components

    With the power of Felgo Apps at hand, there’s no need to use outdated controls that were part of the Games module. You can take advantage of Felgo Apps Controls and Qt Quick Controls 2 for your games as well.

    To make the difference clear and match the name pattern of Felgo app controls like AppButton, those game controls now prepend ‘Game’. In case a ‘VPlay’ suffix was used, it is removed:

    Those types are also marked deprecated and won’t receive updates anymore. We advise to not use these types in future projects.

Felgo Releases before 2019

List of older releases: Felgo Updates (Older Releases)

Qt_Technology_Partner_RGB_475 Qt_Service_Partner_RGB_475_padded