Warning, /system/mycroft-gui/documentation/README.md is written in an unsupported language. File is not indexed.

0001 **Draft Version: 0.1 | Document Author: Aditya Mehra | Status: Incomplete | Last Modified: 23rd August 2019**
0002 
0003 In the age of information visualization is eminently essential to grab attention and create a promising communication strategy. Visual content that supports your spoken content can make it easier to present information well and more engaging for your audience and users.
0004 
0005 <img src="https://images.theconversation.com/files/205921/original/file-20180212-58348-1sbutu2.jpg?ixlib=rb-1.1.0&rect=0%2C604%2C3994%2C1994&q=45&auto=format&w=1356&h=668&fit=crop" />
0006 
0007 (Image to be replaced by orignal artwork..)
0008 
0009 #### INTRODUCTION TO MYCROFT-GUI
0010 
0011 Mycroft-GUI is an open source visual and display framework for Mycroft running on top of KDE Plasma Technology and built using Kirigami a lightweight user interface framework for convergent applications which are empowered by Qt.
0012 
0013 #### GETTING STARTED
0014 
0015 Mycroft is an open source voice assistant that can be extended and expanded to the limits of your imagination. Mycroft can run anywhere from your desktop to your automobiles or on smart devices that empower your home.
0016 
0017 Want Mycroft to do something new? Teach Mycroft a skill, share it, and improve the experience for tens of thousands of people all over the world. This guide aims to provide you with resources to create familar and consistent visual experiences with your expanding and innovative skills.
0018 
0019 The Mycroft GUI Visual Skill Development Guide is divided into two sections:
0020 
0021 ##### Visual Skill Development API Foundation
0022 
0023 - Learn and familarize yourself with the basics of expanding your voice only skills with the Visual Skill Development API for devices that support displays..(Learn More Link)
0024 
0025 ##### Visual Skill Development Human Interface Guidelines
0026 
0027 - Learn about the best practises and design philosphy to creating consistent visual experiences..(Learn More Link)
0028 
0029 ## VISUAL SKILL DEVELOPMENT API FOUNDATION
0030 
0031 Mycroft enabled devices with displays such as the Mark II, KDE Plasmoid provide skill developers the opportunity to create skills that can be empowered by both voice and screen interaction. The display interaction technology is based on the QML user interface markup language that gives you complete freedom to create in-depth innovative interactions without boundries or provide you with simple templates within the Mycroft GUI framework that allow minimalistic display of text and images based on your skill development specifics and preferences.
0032 
0033 This section of the guide is divided into two skill examples that will show you how to create:
0034 
0035 - In-depth QML based audio and visual interaction skills
0036 
0037 - Simple template based text and image skills
0038 
0039 #### In-depth QML based audio and visual interaction skills
0040 
0041 QML user interface markup language is a declartive language built on top of Qt's existing strengths designed to describe the user interface of a program: both what it looks like, and how it behaves. QML provides modules that consist of sophisticated set of graphical and behavioral building elements. In the example below we will showcase how to create a QML interface for your skill including how it interacts with your voice skill.
0042 
0043 ##### Before Getting Started Resources
0044 
0045 A collection of resources to familarize you with QML and Kirigami Framework.
0046 
0047 - [Introduction to QML ](http://doc.qt.io/qt-5/qml-tutorial.html)
0048 
0049 - [Introduction to Kirigami](https://www.kde.org/products/kirigami/)
0050 
0051 ##### Building your skill to support display
0052 
0053 Skills for Mycroft AI are written in Python, using the skills development guide available [here](https://mycroft.ai/documentation/skills/developing-skills/)
0054 
0055 #### Recipes Skill Example
0056 
0057 Let's walk you through some basics of writing your QML user interface, this section is divided into 5 parts:
0058 
0059 - [Importing Modules](#Importing-Modules)
0060 
0061 - [Using Mycroft-GUI Framework Base Delegates](#Using-Mycroft-GUI-Framework)
0062 
0063 - [Using Mycroft Framework Components](#Using-Mycroft-Framework-Components)
0064 
0065 - [Event Handling](#Event-Handling)
0066 
0067 - [Resting Faces](#Resting-Faces)
0068 
0069 ##### Importing Modules
0070 
0071 A QML module provides versioned types and JavaScript resources in a type namespace which may be used by clients who import the module. Modules make use of the QML versioning system which allows modules to be independently updated. More in-depth information about QML modules can be found here [Qt Qml Modules Documentation](http://doc.qt.io/qt-5/qtqml-modules-topic.html)
0072 
0073 In the code snippet example below we will look at importing some of the common modules that provide the components required to get started with our Visual User Interface.
0074 
0075 ```
0076 import QtQuick 2.4
0077 import QtQuick.Controls 2.2
0078 import QtQuick.Layouts 1.4
0079 import org.kde.kirigami 2.4 as Kirigami
0080 import Mycroft 1.0 as Mycroft
0081 import org.kde.lottie 1.0
0082 ```
0083 
0084 ###### QTQuick Module:
0085 
0086 Qt Quick module is the standard library for writing QML applications, the module provides a visual canvas and includes types for creating and animating visual components, receiving user input, creating data models and views and delayed object instantiation. In-depth information about QTQuick can be found at [Qt Quick Documentation](https://doc.qt.io/qt-5.11/qtquick-index.html)
0087 
0088 ###### QTQuick.Controls Module:
0089 
0090 The QtQuick Controls module provides a set of controls that can be used to build complete interfaces in Qt Quick. Some of the controls provided are button controls, container controls, delegate controls, indicator controls, input controls, navigation controls and more, for a complete list of controls and components provided by QtQuick Controls you can refer to [QtQuick Controls 2 Guidelines](https://doc.qt.io/qt-5.11/qtquickcontrols2-guidelines.html)
0091 
0092 ###### QtQuick.Layouts Module:
0093 
0094 QtQuick Layouts are a set of QML types used to arrange items in a user interface. Some of the layouts provided by QtQuick Layouts are Coloumn Layout, Grid Layout, Row Layout and more, for a complete list of layouts you can refer to [QtQuick Layouts Documentation](http://doc.qt.io/qt-5/qtquicklayouts-index.html)
0095 
0096 ###### Kirigami Module:
0097 
0098 [Kirigami](https://api.kde.org/frameworks/kirigami/html/index.html) is a set of QtQuick components for mobile and convergent applications. [Kirigami](https://api.kde.org/frameworks/kirigami/html/index.html) is a set of high level components to make the creation of applications that look and feel great on mobile as well as desktop devices and follow the [Kirigami Human Interface Guidelines](https://community.kde.org/KDE_Visual_Design_Group/KirigamiHIG)
0099 
0100 ###### Mycroft Module:
0101 
0102 Mycroft GUI frameworks provides a set of high level components and events system for aiding in the development of mycroft visual skills. One of the controls provided by Mycroft GUI frameworks are Mycroft-GUI Framework Base Delegates [Mycroft-GUI Framework Base Delegates Documentation](#)
0103 
0104 ###### QML Lottie Module:
0105 
0106 This provides a QML `Item` to render Adobe® After Effects™ animations exported as JSON with Bodymovin using the Lottie Web library. For list of all properties supported refer [Lottie QML](https://github.com/kbroulik/lottie-qml)
0107 
0108 ##### Using Mycroft-GUI Framework Base Delegates
0109 
0110 When you design your skill with QML, Mycroft-GUI frameworks provides you with some base delegates you should use when desiging your GUI skill. The base delegates provide you with a basic presentation layer for your skill with some property assignments that can help you setup background images, background dim, timeout and grace time properties to give you the control you need for rendereing an experience. In your GUI Skill you can use:
0111 
0112 - Mycroft.Delegate: *Needs Description*
0113 
0114   Simple display Image and Text Example using Mycroft.Delegate
0115 
0116   ```
0117   import Mycroft 1.0 as Mycroft
0118   
0119   Mycroft.Delegate {
0120       skillBackgroundSource: sessionData.exampleImage
0121       ColumnLayout {
0122           anchors.fill: parent
0123           Image {
0124               id: imageId
0125               Layout.fillWidth: true
0126               Layout.preferredHeight: Kirigami.Units.gridUnit * 2
0127               source: "https://source.unsplash.com/1920x1080/?+autumn"
0128            }
0129            Label {
0130               id: labelId
0131               Layout.fillWidth: true
0132               Layout.preferredHeight: Kirigami.Units.gridUnit * 4
0133               text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."            
0134           }
0135       }
0136   }
0137   ```
0138 
0139 - Mycroft.ScrollableDelegate: *Needs Description*
0140 
0141   Example of using Mycroft.ScrollableDelegate
0142 
0143   ```
0144   import QtQuick 2.4
0145   import QtQuick.Controls 2.2
0146   import QtQuick.Layouts 1.4
0147   import org.kde.kirigami 2.4 as Kirigami
0148   import Mycroft 1.0 as Mycroft
0149   
0150   Mycroft.ScrollableDelegate{
0151       id: root
0152       skillBackgroundSource: sessionData.background
0153       property var sampleModel: sessionData.sampleBlob
0154   
0155       Kirigami.CardsListView {
0156           id: exampleListView
0157           Layout.fillWidth: true
0158           Layout.fillHeight: true
0159           model: sampleModel.lorem
0160           delegate: Kirigami.AbstractCard {
0161               id: rootCard
0162               implicitHeight: delegateItem.implicitHeight + Kirigami.Units.largeSpacing
0163               contentItem: Item {
0164                   implicitWidth: parent.implicitWidth
0165                   implicitHeight: parent.implicitHeight
0166                   ColumnLayout {
0167                       id: delegateItem
0168                       anchors.left: parent.left
0169                       anchors.right: parent.right
0170                       anchors.top: parent.top
0171                       spacing: Kirigami.Units.largeSpacing
0172                       Kirigami.Heading {
0173                           id: restaurantNameLabel
0174                           Layout.fillWidth: true
0175                           text: modelData.text
0176                           level: 2
0177                           wrapMode: Text.WordWrap
0178                       }
0179                       Kirigami.Separator {
0180                           Layout.fillWidth: true
0181                       }
0182                       Image {
0183                           id: placeImage
0184                           source: modelData.image
0185                           Layout.fillWidth: true
0186                           Layout.preferredHeight: Kirigami.Units.gridUnit * 3
0187                           fillMode: Image.PreserveAspectCrop
0188                       }
0189                       Item {
0190                           Layout.fillWidth: true
0191                           Layout.preferredHeight: Kirigami.Units.gridUnit * 1
0192                       }
0193                   }
0194               }
0195           }
0196       }
0197   }
0198   ```
0199 
0200 ##### Using Mycroft Framework Components
0201 
0202 #### Simple template based text and image skill displays
0203 
0204 Designing a simple skill and only want to display text or images ? Mycroft GUI framwork and Mycroft enclosure API provides ready to use QML based template wrappers that can minimalisticly display simple skills data such as text and images. In the example below we will showcase how to create a simple voice skill that displays simple text on your mycroft enabled device with a display.
0205 
0206 **Text Example:**
0207 
0208 ```python
0209 ...
0210 def handle_hello_world(self, message):
0211 ... 
0212 self.gui.show_text("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmo tempor incididunt ut labore et dolore magna aliqua.")
0213 ...
0214 ```
0215 
0216 **Image Example**
0217 
0218 ```python
0219 ...
0220 def handle_hello_world(self, message):
0221 ...
0222 self.gui.show_image("https://source.unsplash.com/1920x1080/?+autumn")
0223 ...
0224 ```
0225 
0226 **HTML Url Example**
0227 
0228 ```python
0229 ...
0230 def handle_hello_world(self, message):
0231 ...
0232 self.gui.show_url("https://mycroft.ai")
0233 ...
0234 ```
0235 
0236 **HTML Raw Example**
0237 
0238 ```
0239 ...
0240 def handle_hello_world(self, message):
0241 ...
0242 rawhtmlexample = """<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
0243 <html xmlns="http://www.w3.org/1999/xhtml">
0244 <head>
0245 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
0246 <title>Untitled Document</title>
0247 <body>
0248 <h1> HTML Example </h1>
0249 <p> This is an example of an HTML webpage. </p>
0250 <p> <b>Tags</b> can be wrapped <i>inside other tags!</i> </p>
0251 
0252 <p>
0253     HTML doesn't care about extra spaces, tabs or newlines,
0254     so we can use indentation and spacing to keep everything
0255     lined up nicely.
0256 </p>
0257 
0258 <ul>
0259     <li> This is how you create a bulleted list! </li>
0260     <li> Item 2 </li>
0261     <li> Item 3 </li>
0262 </ul>
0263 </body>
0264 </html>
0265 """ 
0266 self.gui.show_html(rawhtmlexample)
0267 ...
0268 ```
0269 
0270 #### Advanced skill displays using QML
0271 
0272 **Display Lottie Animations**:
0273 
0274 You can use the `LottieAnimation` item just like any other `QtQuick` element, such as an `Image` and place it in your scene any way you please.
0275 
0276 **QML Example**
0277 
0278 ```
0279 import QtQuick 2.4
0280 import QtQuick.Controls 2.2
0281 import QtQuick.Layouts 1.4
0282 import org.kde.kirigami 2.4 as Kirigami
0283 import Mycroft 1.0 as Mycroft
0284 import org.kde.lottie 1.0
0285 
0286 Mycroft.Delegate {
0287     LottieAnimation {     
0288         id: fancyAnimation 
0289         anchors.fill: parent
0290         source: Qt.resolvedUrl("animations/fancy_animation.json")
0291         loops: Animation.Infinite
0292         fillMode: Image.PreserveAspectFit    
0293         running: true
0294     }    
0295 }
0296 ```
0297 
0298 **Display Sliding Images**
0299 
0300 Contains an image that will slowly scroll in order to be shown completely
0301 
0302 **QML Example**
0303 
0304 ```
0305 import QtQuick 2.4
0306 import QtQuick.Controls 2.2
0307 import QtQuick.Layouts 1.4
0308 import org.kde.kirigami 2.4 as Kirigami
0309 import Mycroft 1.0 as Mycroft
0310 
0311 Mycroft.Delegate {
0312      background: Mycroft.SlidingImage {
0313      source: "foo.jpg" 
0314      running: bool    //If true the sliding animation is active
0315      speed: 1         //Animation speed in Kirigami.Units.gridUnit / second
0316    }
0317 }
0318 ```
0319 
0320 **Display Paginated Text**
0321 
0322 Takes a long text and breaks it down into pages that can be horizontally swiped
0323 
0324 **QML Example**
0325 
0326 ```
0327 import QtQuick 2.4
0328 import QtQuick.Controls 2.2
0329 import QtQuick.Layouts 1.4
0330 import org.kde.kirigami 2.4 as Kirigami
0331 import Mycroft 1.0 as Mycroft
0332 
0333 Mycroft.Delegate {
0334      Mycroft.PaginatedText {
0335          text: string      //The text that should be displayed
0336          currentIndex: 0   //The currently visible page number (starting from 0)
0337      }
0338 }
0339 ```
0340 
0341 **Display A Vertical ListView With Information Cards**
0342 
0343 Kirigami CardsListView is a ListView which can have AbstractCard as its delegate: it will automatically assign the proper spacings and margins around the cards adhering to the design guidelines.
0344 
0345 **Python Skill Example**
0346 
0347 ```python
0348 ...
0349 def handle_food_places(self, message):
0350 ...
0351 self.gui["foodPlacesBlob"] = results.json
0352 self.gui.show_page("foodplaces.qml")
0353 ...
0354 ```
0355 
0356 **QML Example**
0357 
0358 ```
0359 import QtQuick 2.4
0360 import QtQuick.Controls 2.2
0361 import QtQuick.Layouts 1.4
0362 import org.kde.kirigami 2.4 as Kirigami
0363 import Mycroft 1.0 as Mycroft
0364 
0365 Mycroft.Delegate{
0366     id: root
0367     property var foodPlacesModel: sessionData.foodPlacesBlob
0368 
0369     Kirigami.CardsListView {
0370         id: restaurantsListView
0371         Layout.fillWidth: true
0372         Layout.fillHeight: true
0373         model: foodPlacesModel
0374         delegate: Kirigami.AbstractCard {
0375             id: rootCard
0376             implicitHeight: delegateItem.implicitHeight + Kirigami.Units.largeSpacing
0377             contentItem: Item {
0378                 implicitWidth: parent.implicitWidth
0379                 implicitHeight: parent.implicitHeight
0380                 ColumnLayout {
0381                     id: delegateItem
0382                     anchors.left: parent.left
0383                     anchors.right: parent.right
0384                     anchors.top: parent.top
0385                     spacing: Kirigami.Units.smallSpacing
0386                     Kirigami.Heading {
0387                         id: restaurantNameLabel
0388                         Layout.fillWidth: true
0389                         text: modelData.name
0390                         level: 3
0391                         wrapMode: Text.WordWrap
0392                     }
0393                     Kirigami.Separator {
0394                         Layout.fillWidth: true
0395                     }
0396                     RowLayout {
0397                         Layout.fillWidth: true
0398                         Layout.preferredHeight: form.implicitHeight
0399                         Image {
0400                             id: placeImage
0401                             source: modelData.image
0402                             Layout.fillHeight: true
0403                             Layout.preferredWidth: placeImage.implicitHeight + Kirigami.Units.gridUnit * 2
0404                             fillMode: Image.PreserveAspectFit
0405                         }
0406                         Kirigami.Separator {
0407                             Layout.fillHeight: true
0408                         }
0409                         Kirigami.FormLayout {
0410                             id: form
0411                             Layout.fillWidth: true
0412                             Layout.minimumWidth: aCard.implicitWidth
0413                             Layout.alignment: Qt.AlignLeft | Qt.AlignBottom
0414                             Label {
0415                                 Kirigami.FormData.label: "Description:"
0416                                 Layout.fillWidth: true
0417                                 wrapMode: Text.WordWrap
0418                                 elide: Text.ElideRight
0419                                 text: modelData.restaurantDescription
0420                             }
0421                             Label {
0422                                 Kirigami.FormData.label: "Phone:"
0423                                 Layout.fillWidth: true
0424                                 wrapMode: Text.WordWrap
0425                                 elide: Text.ElideRight
0426                                 text: modelData.phone
0427                             }
0428                         }
0429                     }
0430                 }
0431             }
0432         }
0433     }
0434 }
0435 ```
0436 
0437 **Using Proportional Delegate For Simple Display Skills & Auto Layout**
0438 
0439 **ProportionalDelegate** is a delegate which has proportional paddings and a columnlayout as mainItem. The delegate supports a proportionalGridUnit which is based upon its size and the contents are supposed to be scaled proportionally to the delegate size either directly or using the proportionalGridUnit.
0440 
0441 **AutoFitLabel** is a label that will always scale its text size according to the item size rather than the other way around
0442 
0443 **QML Example**
0444 
0445 ```
0446 import QtQuick 2.4
0447 import QtQuick.Controls 2.2
0448 import QtQuick.Layouts 1.4
0449 import org.kde.kirigami 2.4 as Kirigami
0450 import Mycroft 1.0 as Mycroft
0451 
0452 Mycroft.ProportionalDelegate {
0453     id: root
0454 
0455     Mycroft.AutoFitLabel {
0456         id: monthLabel
0457         font.weight: Font.Bold
0458         Layout.fillWidth: true
0459         Layout.preferredHeight: proportionalGridUnit * 40
0460         text: sessionData.month
0461     }
0462 
0463     Mycroft.AutoFitLabel {
0464         id: dayLabel
0465         font.weight: Font.Bold
0466         Layout.fillWidth: true
0467         Layout.preferredHeight: proportionalGridUnit * 40
0468         text: sessionData.day
0469     }
0470 }
0471 ```
0472 
0473 **Using Slideshow Component To Show Cards Slideshow**
0474 
0475 Slideshow component lets you insert a slideshow yith your custom delegate in any skill display which can be tuned to autoplay and loop and also scrolled or flicked manually by the user.
0476 
0477 **QML Example**
0478 
0479 ```
0480 import QtQuick 2.4
0481 import QtQuick.Controls 2.2
0482 import QtQuick.Layouts 1.4
0483 import org.kde.kirigami 2.4 as Kirigami
0484 import Mycroft 1.0 as Mycroft
0485 
0486 Mycroft.Delegate {
0487     id: root
0488 
0489     Mycroft.SlideShow {
0490         id: simpleSlideShow 
0491         model: sessionData.exampleModel // model with slideshow data
0492         anchors.fill: parent
0493         interval: 5000 // time to switch between slides 
0494         running: true // can be set to false if one wants to swipe manually
0495         loop: true // can be set to play through continously or just once
0496         delegate: Kirigami.AbstractCard { 
0497             width: rootItem.width
0498             height: rootItem.height
0499             contentItem: ColumnLayout {
0500                 anchors.fill: parent
0501                 Kirigami.Heading {
0502                     Layout.fillWidth: true
0503                     wrapMode: Text.WordWrap
0504                     level: 3
0505                     text: modelData.Title
0506                 }
0507                 Kirigami.Separator {
0508                         Layout.fillWidth: true
0509                         Layout.preferredHeight: 1
0510                 }
0511                 Image {
0512                     Layout.fillWidth: true
0513                     Layout.preferredHeight: rootItem.height / 4
0514                     source: modelData.Image
0515                     fillMode: Image.PreserveAspectCrop
0516                 }
0517             }
0518         }
0519     }
0520 }
0521 ```
0522 
0523 ##### Using AudioPlayer Component To Play Audio Files / Audio Streaming
0524 
0525 AudioPlayer component is a custom wrapper around Qt Multimedia MediaPlayer, that gives the Skill Authors a basic responsive design audio player they can plug into their skills.
0526 
0527 **QML Example**
0528 
0529 ```
0530 import QtQuick 2.4
0531 import QtQuick.Controls 2.2
0532 import QtQuick.Layouts 1.4
0533 import org.kde.kirigami 2.4 as Kirigami
0534 import Mycroft 1.0 as Mycroft
0535 
0536 Mycroft.Delegate {
0537     id: root
0538     skillBackgroundSource: sessionData.audioThumbnail
0539 
0540     Mycroft.AudioPlayer {
0541         id: examplePlayer
0542         anchors.fill: parent
0543         source: sessionData.audioSource        //Set URL of audio file
0544         thumbnail: sessionData.audioThumbnail  //Set Thumbnail of audio
0545         title: sessionData.audioTitle          //Set Title of audio 
0546         nextAction: "author.example-player.next" //Event to drive next button action in skill
0547         previousAction: "author.example-player.previous" //Event to drive previous button action in skill
0548         status: sessionData.status             //Current status of playing audio
0549     }
0550 }
0551 ```
0552 
0553 ##### Event Handling
0554 
0555 Mycroft GUI API provides an Event Handling Protocol between the skill and QML display which allow Skill Authors to forward events in either direction to an event consumer. Skill Authors have the ability to create any amount of custom events. Event names that start with "system." are available to all skills, like previous/next/pick.
0556 
0557 **Simple Event Trigger Example From QML Display To Skill**
0558 
0559 **Python Skill Example**
0560 
0561 ```python
0562     def initialize(self):
0563     # Initialize...
0564         self.gui.register_handler('skill.foo.event', self.handle_foo_event)
0565 ...
0566     def handle_foo_event(self, message):
0567         self.speak(message.data["string"])
0568 ...
0569 ...
0570 ```
0571 
0572 **QML Example**
0573 
0574 ```
0575 import QtQuick 2.4
0576 import QtQuick.Controls 2.2
0577 import QtQuick.Layouts 1.4
0578 import org.kde.kirigami 2.4 as Kirigami
0579 import Mycroft 1.0 as Mycroft
0580 
0581 Mycroft.Delegate {
0582     id: root
0583 
0584     Button {
0585         anchors.fill: parent
0586         text: "Click Me"
0587         onClicked: {
0588             triggerGuiEvent("skill.foo.event", {"string": "Lorem ipsum dolor sit amet"})
0589         }
0590     }
0591 }
0592 ```
0593 
0594 **Simple Event Trigger Example From Skill To QML Display**
0595 
0596 **Python Skill Example**
0597 
0598 ```python
0599 ...
0600     def handle_foo_intent(self, message):
0601         self.gui['foobar'] = message.data.get("utterance")
0602         self.gui['color'] = "blue"
0603         self.gui.show_page("foo.qml")
0604 ...
0605 ...
0606 ```
0607 
0608 **QML Example**
0609 
0610 ```
0611 import QtQuick 2.4
0612 import QtQuick.Controls 2.2
0613 import QtQuick.Layouts 1.4
0614 import org.kde.kirigami 2.4 as Kirigami
0615 import Mycroft 1.0 as Mycroft
0616 
0617 Mycroft.Delegate {
0618     id: root
0619     property var fooString: sessionData.foobar
0620 
0621     onFooStringChanged: {
0622         fooRect.color = sessionData.color 
0623     }
0624 
0625     Rectangle {
0626         id: fooRect
0627         anchors.fill: parent
0628         color: "#fff"
0629     }
0630 }
0631 ```
0632 
0633 ##### Resting Faces
0634 
0635 The resting face API provides skill authors the ability to extend their skills to supply their own customized IDLE screens that will be displayed when there is no activity on the screen.
0636 
0637 **Simple Idle Screen Example**
0638 
0639 **Python Skill Example**
0640 
0641 ```
0642 from mycroft.skills.core import resting_screen_handler
0643 ...
0644 @resting_screen_handler('NameOfIdleScreen')
0645 def handle_idle(self, message):
0646     self.gui.clear()
0647     self.log.info('Activating foo/bar resting page')
0648     self.gui["exampleText"] = "This Is A Idle Screen"
0649     self.gui.show_page('idle.qml')
0650 ```
0651 
0652 **QML Example**
0653 
0654 ```
0655 import QtQuick 2.4
0656 import QtQuick.Controls 2.2
0657 import QtQuick.Layouts 1.4
0658 import org.kde.kirigami 2.4 as Kirigami
0659 import Mycroft 1.0 as Mycroft
0660 
0661 Mycroft.Delegate {
0662     id: root
0663     property var fooString: sessionData.exampleText
0664  
0665     Kirigami.Heading {
0666         id: headerExample
0667         anchors.centerIn: parent
0668         text: fooString 
0669     }
0670 }
0671 ```