Développer un Widget pour Neotess

Transcription

Développer un Widget pour Neotess
www.neotess.fr
Tél : + 33 (0) 477 91 21 91
Mail : [email protected]
Développer un Widget pour
Neotess
RCS 821 120 581 - N° SIRET 821 120 581 00011 - TVA FR1821120581 – – www.dedicast.fr – [email protected]
1
www.neotess.fr
Tél : + 33 (0) 477 91 21 91
Mail : [email protected]
Sommaire
1.
Le fichier Widget ............................................................................................................................................................................ 3
1.1.
Contenu du fichier widget ............................................................................................................................................... 4
1.2. Réalisation du fichier widget ......................................................................................................................................... 4
2.
Côté interface utilisateur : widget.xml ......................................................................................................................... 4
3.
Côté affichage : widget.qml .................................................................................................................................................. 9
3.1. Extensions Neotess................................................................................................................................................................. 9
3.2. Base de fonctionnement................................................................................................................................................. 10
3.3. Skins ..................................................................................................................................................................................................12
3.3.1.
Utilisation manuelle de la Skin ................................................................................................................ 12
3.3.2.
Utilisation automatique de la Skin ........................................................................................................ 13
3.4. Astuces ............................................................................................................................................................................................15
3.4.1.
Echelle et déformation de l’animation ................................................................................................. 15
3.4.2.
Texte simple ou riche et Qml Text ......................................................................................................... 16
3.4.3.
Adapter la taille des textes ....................................................................................................................... 16
3.4.4.
Manipuler des dates .................................................................................................................................... 18
3.4.5.
Utiliser une source de données texte csv, json................................................................................. 18
3.4.6.
Utiliser une source de données xml ...................................................................................................... 19
3.4.7.
Inclure un contenu de la Bibliothèque................................................................................................. 20
3.5. Référence ....................................................................................................................................................................................20
3.5.1.
Item Widget .................................................................................................................................................... 20
3.5.2.
Dans la méthode start() lorsque le widget n’est pas prêt à être affiché Objet content ... 21
3.5.3.
Item SkinLayout (correspond aux composants SkinBackground ou SkinCell) ..................... 22
3.5.4.
Objet SkinComponent ................................................................................................................................ 23
3.5.5.
Objet ShellItem.............................................................................................................................................. 23
3.5.6.
Objet ServerEventItem ............................................................................................................................... 23
Développer un Flash pour Neotess ......................................................................................................................................... 24
RCS 821 120 581 - N° SIRET 821 120 581 00011 - TVA FR1821120581 – – www.dedicast.fr – [email protected]
2
www.neotess.fr
Tél : + 33 (0) 477 91 21 91
Mail : [email protected]
Un Widget Neotess est un type de Contenu, paramétrable dans l'Interface Neotess et qui
peut être affiché à l'écran ou dans une Zone de Template. Cet affichage peut être animé
(effets, vidéos), dynamique (informations changeantes dans le temps) et aussi interactif
(« clic » de l’utilisateur »).
Plusieurs versions des widgets ont existé : les « widgets 1 », compatibles avec les players
Neotess 2012 et aujourd’hui obsolètes ; et les « widgets 2 », compatibles avec le serveur et les
players Neotess 2014 et ultérieurs.
Il existe des widgets prenant en charge l’affichage des contenus dits « internes » du logiciel :
images, vidéos, playlists, templates. Ceux-ci sont communs à tous les clients d’un même
serveur Neotess. Ils sont utilisés en conjonction avec des fichiers importés dans la
bibliothèque ou au moyen de l’éditeur de playlists et de template.
D’autres widgets, sur lesquels porte ce document, permettent à l’utilisateur de saisir des
paramètres au moyen de l’interface « Nouveau contenu » de Neotess, et d’afficher à l’écran
une animation prédéfinie au moyen de ces paramètres. Ces widgets peuvent être proposés
par défaut dans les comptes client du serveur, ou bien être installés par l’utilisateur dans son
compte client :
o
o
Soit depuis un dialogue proposant de télécharger et d'installer une liste de
Widgets proposés par Neotess
Soit en choisissant un fichier depuis son disque dur.
L'objet de ce document est d'expliquer la réalisation de Widget en version 2.
1. Le fichier Widget
Le fichier Widget est une archive zip :
Elle porte le nom du widget sans espaces avec les premières lettres des mots en
Majuscules (seuls les widgets internes ont des noms en minuscules).
Son extension est .zip en minuscules.
RCS 821 120 581 - N° SIRET 821 120 581 00011 - TVA FR1821120581 – – www.dedicast.fr – [email protected]
3
www.neotess.fr
Tél : + 33 (0) 477 91 21 91
Mail : [email protected]
1.1.
Contenu du fichier widget
L'archive zip contient à sa racine les fichiers suivants :
widget.xml : le fichier nécessaire à l'interface d'édition
widget.qml : le fichier nécessaire à l'affichage
skins (optionnel) : un répertoire contenant des sous-répertoires contenant des Skins
(widget.png : l'icône utilisée par le Widget et par les fichiers du type de ce Widget)
(thumbnail.png : l'imagette du Widget)
Ainsi que des répertoires et autres fichiers utilisés par widget.qml
1.2.
Réalisation du fichier widget
Sous linux utilisez la commande :
zip –r MonWidget.zip widget.* thumbnail.png skins
Sous windows, sélectionnez widget.xml, widget.qml ainsi que les autre fichiers et répertoires
(ne sélectionnez pas le répertoire parent !) puis dans le menu contextuel choisissez "Envoyer
Vers" puis "Dossier Compressé".
2. Côté interface utilisateur : widget.xml
Neotess présente un formulaire lors de la création ou de l’édition d’un contenu widget.
RCS 821 120 581 - N° SIRET 821 120 581 00011 - TVA FR1821120581 – – www.dedicast.fr – [email protected]
4
www.neotess.fr
Tél : + 33 (0) 477 91 21 91
Mail : [email protected]
widget.xml décrit ce formulaire de création ou de modification du Contenu. Il doit respecter
la syntaxe XML suivante :
<?xml version="1.0" encoding="utf-8"?>
<widget>
<extension>textexample</extension>
L'extension du fichier Contenu associé
<name>TextExample</name>
Le nom du Widget dans l'interface
<version>1</version>
Un numéro de version
<desc>Texte sur fond coloré</desc>
Description apparaissant en haut du formulaire
<categories>
┐
<category>Texte</category>
│ Les catégories dans lesquelles le widget est
<category>Grand</category>
│ proposé à l'utilisateur dans l’interface
</categories>
┘
<parsable>content</parsable>
Indique que le fichier Contenu est au format
XML
<maxWidth>1920</maxWidth>
Largeur dans laquelle est exprimée l’animation
<maxHeight>1080</maxHeight>
Hauteur dans laquelle est exprimée l’animation
<params>
┐
<param type="LONGTEXT"
name="texte" label="Texte"/>
<param type="COLOR" name="couleur"
label="Couleur du fond"/>
│
│ La liste de paramètres éditables par
│ l'utilisateur
</params>
│
</widget>
┘
L’<extension> est utilisée comme extension de fichier et doit être unique dans le compte
client.
RCS 821 120 581 - N° SIRET 821 120 581 00011 - TVA FR1821120581 – – www.dedicast.fr – [email protected]
5
www.neotess.fr
Tél : + 33 (0) 477 91 21 91
Mail : [email protected]
<maxWidth> et <maxHeight> sont la largeur et la hauteur de référence dans laquelle
l’animation est exprimée au moyen des fonctions scaleX, scaleY et scaleXY (cf objet
Content). Il est plus facile d’utiliser ici les dimensions en pixels de l’animation à l’échelle dans
laquelle elle est réalisée.
Les paramètres <param> sont affichés en tant que champs du formulaire. Ils disposent au
minimum d’un type ci-après et d’un name ; les attributs ci-dessous sont communs à tous les
types :
name = le nom de variable, sans espaces ni caractères spéciaux ; unique dans le
formulaire
label = le texte affiché dans l'interface
orderColumn="true" le paramètre est utilisé comme critère de tri des contenus dans
un répertoire spécialisé lors de son affichage dans l’interface (mais pas lors de la
diffusion du répertoire !).
Type
Description
Attributs
NONE
paramètre ignoré : non affiché dans le
formulaire et non enregistré dans le
contenu
EDIT
Champ de saisie de texte monoligne
default = le texte par défaut pour un
nouveau Contenu
CHECK
Boite à cocher. Le paramètre prend la
valeur « true » ou « false »
default = la valeur par défaut « true » ou
« false » pour un nouveau contenu
RSS
Champ de saisie d'URL avec proposition
en dropdown des URLs des chaînes
disponibles dans l’agrégateur RSS
default = le texte par défaut pour un
nouveau Contenu
cache = true/false : l'URL est téléchargée
en cache avant l'affichage du widget
cacheTimeout = âge en secondes après
lequel l'URL est retéléchargée
cacheExpires = âge en secondes après
lequel l'URL est expirée et n'est plus
affichée
RCS 821 120 581 - N° SIRET 821 120 581 00011 - TVA FR1821120581 – – www.dedicast.fr – [email protected]
6
www.neotess.fr
Tél : + 33 (0) 477 91 21 91
Mail : [email protected]
SKINS
Liste déroulante des Skins disponibles
default = le nom de la Skin proposée par
défaut pour un nouveau contenu
TOWNS
Liste prédéfinie des villes en France
Métropolitaine supportées par le widget
Meteo.
default = le texte par défaut pour un
nouveau Contenu
Saisir la première lettre de la ville en
majuscules puis sélectionner le nom dans
la liste proposée
LONGTEXT
Champ de saisie de texte multiligne.
default = le texte par pour un nouveau
Contenu (texte simple sur 1 seule ligne)
RICHTEXT
Champ de saisie de texte enrichi
default = le texte par défaut pour un
nouveau Contenu (texte simple sur 1 seule
ligne)
SIMPLERICHTEXT
Champ de saisie de texte enrichi autres
boutons
default = le texte par défaut pour un
nouveau Contenu (texte simple sur 1 seule
ligne)
INTEGER
Champ de saisie d’un nombre entier
default = la valeur par défaut
Seulement chiffres et - autorisés
DECIMAL
Champ de saisie d’un nombre décimal
default = la valeur par défaut avec un .
comme séparateur décimal
Seulement chiffres et - autorisés ainsi que
, ou . selon la langue de l’interface
Toujours enregistré avec un . comme
séparateur décimal
OPACITY
Slider à 101 positions, valeur entière de 1 à
100
default = la valeur entière par défaut
FONTSIZE
Slider à 101 positions, valeur entière de 3 à
500 (par incréments de 2 ou 3)
default = la valeur entière par défaut
RCS 821 120 581 - N° SIRET 821 120 581 00011 - TVA FR1821120581 – – www.dedicast.fr – [email protected]
7
www.neotess.fr
Tél : + 33 (0) 477 91 21 91
Mail : [email protected]
DATE
Champ calendrier de saisie de date
Par défaut la date du jour
Format : 2014/05/15 15:40:12
TIME
Champ de saisie d’heure
Par défaut l’heure courante
Format : 17:40:14
WEEK
Champ de saisie du numéro de semaine ;
indique la date du lundi et du vendredi
de la semaine choisie
Par défaut la semaine courante
Format : 20150216,20150220
LIST
Liste déroulante de valeurs prédéfinies
values = liste séparée par des virgules des
valeurs imposées : « valeur 1,valeur 2 »
Ou liste en format clé,libellé : « valeur
1,libelle 1;valeur 2,libelle 2 »
default = le choix par défaut pour un
nouveau Contenu ; si invalide ou non
défini alors la valeur pourrait être
enregistrée vide et donc différente des
valeurs imposées
DROPDOWN
Champ de saisie de texte monoligne avec
proposition déroulante de valeurs
prédéfinies
values = liste séparée par des virgules des
valeurs proposées. Ex : « valeur 1,valeur 2 »
default = le texte par défaut pour un
nouveau Contenu
CONTENT
Champ de sélection d’un contenu dans la
Bibliothèque de contenus
RCS 821 120 581 - N° SIRET 821 120 581 00011 - TVA FR1821120581 – – www.dedicast.fr – [email protected]
8
www.neotess.fr
Tél : + 33 (0) 477 91 21 91
Mail : [email protected]
IMAGECONTENT
Champ de sélection d’un contenu image
(png, jpeg) dans la Bibliothèque de
contenus
COLOR
Champ de saisie de couleur RVB avec
nuancier
default = la couleur par défaut pour un
nouveau Contenu
Format : #aabbcc
PASSWORD
Champ de saisie de mot de passe avec
caractères masqués à l’affichage
default = le texte par défaut pour un
nouveau Contenu
Attention : transmis et stocké en clair
Note : les valeurs sont encodées pour leur stockage et fournies décodées à l’animation qml ;
les valeurs par défaut doivent être encodées dans widget.xml avec le même format.
3. Côté affichage : widget.qml
Le fichier QML widget.qml définit ce qui est affiché à l’emplacement du Widget à l’écran.
C’est un fichier au format qml (Qt Quick 2) utilisant des extensions propres à Neotess.
Premiers pas avec QML : http://qt-project.org/doc/qt-5/qmlfirststeps.html
Une introduction à QML : http://qt-project.org/doc/qt-5/qmlapplications.html
La référence de QML : http://qt-project.org/doc/qt-5/qmlreference.html
La référence Qt Quick : http://qt-project.org/doc/qt-5/qtquick-index.html
Vérifiez sor vos players la version de Qt/QML disponible dont dépendent certaines
fonctionnalités : F8 puis F1.
3.1.
Extensions Neotess
Neotess ajoute des extensions au langage QML. Elles doivent être incluses au moyen de
l’instruction :
import QtQuick 2.0
import Neotess 1.0
Celles-ci ajoutent (cf Référence ci-dessous) :
RCS 821 120 581 - N° SIRET 821 120 581 00011 - TVA FR1821120581 – – www.dedicast.fr – [email protected]
9
www.neotess.fr
Tél : + 33 (0) 477 91 21 91
Mail : [email protected]
-
Les Items Widget, Web, Video, List, Template, Content, Equipment, Session, Shell, ServerEvent,
-
Les objets Javascript content, session et equipment et les variables contenturl et
ListTransition, SkinLayout, SkinComponent, (Kinect, Leap)
contentduration
3.2.
Base de fonctionnement
L’item racine du code du widget Neotess doit être un item Widget. Ici on le baptise
« widget » :
Widget {
id: widget
}
Il est habituellement affiché à la taille du contenu :
width: content.width()
height: content.height()
Les paramètres définis par l’utilisateur sont accessibles au moyen de content.param(). Il est
pratique de les définir comme propriété de l’item Widget et de définir leur éventuelle valeur
par défaut :
property string texte: content.param("texte")
property string couleur:
content.param("couleur")==""?"#FFFFFF":content.param("couleur")
property real opacite: content.param("couleur")==""?0:0.8
La hiérarchie des items QtQuick définit ce qui va être affiché dans le widget. Ici un rectangle
coloré ave un texte à l’intérieur :
Rectangle {
width: parent.width
height: parent.height
color: couleur
opacity: opacite
RCS 821 120 581 - N° SIRET 821 120 581 00011 - TVA FR1821120581 – – www.dedicast.fr – [email protected]
10
www.neotess.fr
Tél : + 33 (0) 477 91 21 91
Mail : [email protected]
Text {
id: textItem
anchors.centerIn: parent
font.pixelSize: content.scaleY(80)
text: texte
}
}
content.duration() et widget.nextContent() permettent de contrôler la durée d’affichage.
content.loop() indique (si true) que le widget est seul dans sa playlist et peut donc être
affiché indéfiniment :
Timer {
id: durationTimer
interval: content.duration() * 1000;
running: !content.loop(); repeat: false;
onTriggered: { widget.nextContent(); }
}
Les fonctions start(), stop() de Widget doivent être surdéfinies pour contrôler l’animation du
widget. L’animation démarre lors de start() et doit s’arrêter lors de stop(). Ici une animation
sur l’échelle du texte :
SequentialAnimation {
id: widgetAnimation
loops: Animation.Infinite
PropertyAnimation { target: textItem; property: "scale";
to: 0.5; duration: 500; easing.type: Easing.InOutQuad; }
PropertyAnimation { target: textItem; property: "scale";
to: 2; duration: 500; easing.type: Easing.InOutQuad; }
RCS 821 120 581 - N° SIRET 821 120 581 00011 - TVA FR1821120581 – – www.dedicast.fr – [email protected]
11
www.neotess.fr
Tél : + 33 (0) 477 91 21 91
Mail : [email protected]
}
function start() {
widgetAnimation.start();
}
function stop() {
widgetAnimation.complete() ;
}
3.3.
Skins
Des Skins peuvent être utilisées pour proposer plusieurs comportements de widgets
différents : habillages, animations, comportements.
Chaque Skin est composée d’un sous-répertoire dans le répertoire « skins » du Widget. Le
nom du répertoire est le nom de la Skin, qui doit être sans espace ni caractères spéciaux.
Pour utiliser les Skins, widget.xml doit contenir un param de type SKINS. Celui-ci permet à
l'utilisateur de choisir une Skin parmi celles proposées.
Le répertoire de la Skin contient :
o
o
o
skin.xml : un fichier xml de paramètres pouvant changer d'une Skin à l'autre
les images de la Skin : celle-ci sont utilisées dans widget.qml au moyen de
content.skinUrl()
d’autres fichiers, eux aussi utilisés dans widget.qml (polices TTF…)
3.3.1. Utilisation manuelle de la Skin
Par exemple le fichier skin.xml suivant :
<?xml version="1.0" encoding="utf-8"?>
<skin name="xyz">
<image x="530" y="110" width="600" height="140" border="false"/>
RCS 821 120 581 - N° SIRET 821 120 581 00011 - TVA FR1821120581 – – www.dedicast.fr – [email protected]
12
www.neotess.fr
Tél : + 33 (0) 477 91 21 91
Mail : [email protected]
<text x="530" y="250" width="600" height="400" font="Arial" size="24"
align="left" bold="false" color="#555555"/>
</skin>
widget.qml utilise les valeurs de la skin sélectionnée au moyen des fonctions suivantes :
content.skinAttribute("image", "y") retourne "110"
content.skinRootAttr("name") retourne "xyz"
content.skinUrl("background.jpg") retourne
"file://skins/LaSkin/background.jpg"
3.3.2. Utilisation automatique de la Skin
Un skin.xml auto-génère automatiquement des composants QML SkinBackground et
SkinCell qu’il est possible d’insérer dans widget.qml.
SkinBackground contient tous les éléments de premier niveau entre les balises <skin></skin>
SkinCell contient tous les éléments de premier niveau entre les balises <grid></grid>
Les éléments xml composants la Skin sont transformés en trois Items QML :
o Rectangle : un élément contenant l’attribut background="#color" est
o
transformé en Item Rectangle
Image : un élément contenant l’attribut image="nom_de_l’image" est
o
transformé en Item Image
Text : un élément ne contenant ni background ni image est transformé en Item
Text
Les attributs des éléments xml :
o
o
o
o
x, y, width, height, color sont transformés en attributs des Items QML du même
nom
font -> font.family, size ->font.pointSize, bold -> font.bold, align ->
horizontalAlignment
showDelay, showDuration, showEffect déterminent le temps entre le début de
l’animation et le déclenchement de l’effet d’apparition, la durée de l’effet
d’apparition et l’effet d’apparition
hideDelay, hideDuration, hideEffect déterminent le temps entre le début de
l’animation et le déclenchement de l’effet de disparition, la durée de l’effet de
disparition et l’effet de disparition
RCS 821 120 581 - N° SIRET 821 120 581 00011 - TVA FR1821120581 – – www.dedicast.fr – [email protected]
13
www.neotess.fr
Tél : + 33 (0) 477 91 21 91
Mail : [email protected]
Les items contenus dans les items SkinBackground et SkinCell sont adressables par les
méthodes suivantes :
setValue(nom d’élément, valeur)
setProperty(nom d’élément, nom d’attribut, valeur)
Par exemple le fichier skin.xml suivant
<?xml version="1.0" encoding="utf-8"?>
<skin name="xyz">
<image x="530" y="110" width="600" height="140" border="false"/>
<text x="530" y="250" width="600" height="400" font="Arial" size="24"
align="left" bold="false" color="#555555"/>
<grid>
<nom1 x="553" y="37" width="80" height="80" image="."
color="#000000" showDelay="1000" showDuration="500" showEffect="fade"/>
<nom2 x="553" y="37" width="80" height="50" font="Raleway"
size="60" align="center" bold="false" color="#ffffff" showDelay="1000"
showDuration="500" showEffect="fade"/>
<nom3 x="436" y="109" width="80" height="80" image="."
color="#000000" showDelay="1250" showDuration="500" showEffect="fade"/>
</grid>
</skin>
Dans widget.qml :
SkinBackground {
id: infos
// contient image et test positionnés avec les attributs de la
skin
SkinCell {
id: cell
RCS 821 120 581 - N° SIRET 821 120 581 00011 - TVA FR1821120581 – – www.dedicast.fr – [email protected]
14
www.neotess.fr
Tél : + 33 (0) 477 91 21 91
Mail : [email protected]
//contient nom1 à nom3
}
}
start() {
cell.setValue("nom1", content.skinUrl("1.png"));
cell.setValue("nom2", content.skinUrl("titre"));
}
3.4.
Astuces
3.4.1. Echelle et déformation de l’animation
L’animation QML est réalisée dans une résolution native souvent dictée par les éléments
graphiques (images bitmap fournies par le graphiste).
L’animation doit avoir un comportement pour son utilisation à des tailles non natives : le
comportement peut être différent lorsque l’animation est déformée : 16/9, carré, étiré
horizontalement ou verticalement. C’est alors au développeur à prévoir si nécessaire ces
comportements (étirement, centrage, changement de mise en page).
Lorsqu’elle est utilisée à des tailles de même ratio ratio (1920x1080, 1280x720) ou sur le
Diewer/Desktop (1024x600), le comportement préconisé est un redimensionnement.
Pour conserver ce même ratio il est suggéré de procéder comme suit.
Définir dans widget.xml la résolution native de l’animation
<maxWidth>1920</maxWidth>
<maxHeight>1080</maxHeight>
Utiliser dans widget.qml content.scaleX, content.scaleY et content.scaleXY en
remplacement des dimensions natives
Text {
width: content.scaleX(1920); height: content.scaleY(1080/3)
x: 0; y: content.scaleY(320)
RCS 821 120 581 - N° SIRET 821 120 581 00011 - TVA FR1821120581 – – www.dedicast.fr – [email protected]
15
www.neotess.fr
Tél : + 33 (0) 477 91 21 91
Mail : [email protected]
font.pixelSize: content.scaleXY(80)
text: texte
}
3.4.2. Texte simple ou riche et Qml Text
L’item QML Text peut afficher à la fois du texte simple et du texte riche : il est recommandé
de définir le format de texte par la propriété textFormat afin de fiabiliser l’affichage des
caractères spéciaux.
Lorsque il est saisi comme texte simple par l’utilisateur, et affiché comme texte « enrichi »
par le widget, il convient de protéger notamment « & » qui pourra sinon être interprété
comme caractère d’entité html, voire « < > ».
Exemple, affichage de texte simple :
Text {
textFormat: Text.PlainText
text: content.param("texte")
}
Exemple, affichage de texte riche :
Text {
textFormat: Text.RichText
text: "<b>Titre</b><br/>" +
content.param("texte").replace(/&/g,"&amp;")
}
3.4.3. Adapter la taille des textes
Il est souvent souhaité d’adapter un texte à un espace disponible, en jouant sur la taille des
caractères.
Sur une seule ligne :
L’item Texte de QTQuick propose la propriété fontSizeMode dont la valeur Text.Fit permet
d’obtenir l’effet souhaité avec un texte monoligne.
RCS 821 120 581 - N° SIRET 821 120 581 00011 - TVA FR1821120581 – – www.dedicast.fr – [email protected]
16
www.neotess.fr
Tél : + 33 (0) 477 91 21 91
Mail : [email protected]
On peut aussi choisir d’élider la fin du texte :
Text {
x:content.scaleX(20); y:content.scaleY(188);
width:content.scaleX(288); height:content.scaleY(64);
text: hippodrome; font.pixelSize: content.scaleY(55);
onPaintedWidthChanged: { if (paintedWidth>width)
text=(text.slice(-3)=="..."?text.slice(0, text.length-4):text.slice(0,
text.length-1))+"..."; }
}
Sur plusieurs lignes de texte riche :
Il n’existe pas de propriété toute faite donnant le résultat souhaité. Le code ci-dessous peut
aider :
Text {
property int it: 0
width: widget.width
wrapMode: Text.Wrap
font.pixelSize: content.scaleXY(80)
onTextChanged: { it=0; }
onPaintedHeightChanged: { if((it++<10 &&
paintedHeight<widget.height*8/10) || (paintedHeight>widget.height))
font.pixelSize=(font.pixelSize*Math.sqrt(0.9*widget.height/paintedHeight)).
toFixed(); }
}
Sur un arbre d’items QML :
L’astuce ci-dessous consiste à rendre l’arbre dans une taille par défaut avant de l’agrandir
pour occuper un maximum d’espace.
Widget {
id: widget
width: content.width()
height: content.height()
RCS 821 120 581 - N° SIRET 821 120 581 00011 - TVA FR1821120581 – – www.dedicast.fr – [email protected]
17
www.neotess.fr
Tél : + 33 (0) 477 91 21 91
Mail : [email protected]
GridLayout {
id:table
anchors.centerIn: parent
/* Tout un tas d’items */
}
function start() {
table.scale=Math.min(parseFloat(widget.height)/table.height,par
seFloat(widget.width)/table.width);
}
}
3.4.4. Manipuler des dates
Les dates peuvent être utilisées au moyen de l’objet Date de javascript.
Il permet d’utiliser les dates en paramètre de widget :
var date=new Date(content.param("date"))
var time=new Date(date.getFullYear()+"/"+ (date.getMonth()+1)+"/"+
date.getDate()+" "+ content.param("time"))
console.log(time)
Il permet de calculer des décalages de date :
property int forecastDay: (new Date((new Date()).getTime()+
forecastIndex * 12 * 3600 * 1000)).getDate(); //1 a 31
Il peut être affiché selon un format défini et localisé :
Qt.formatDateTime(date, "dddd d MMMM yyyy") ; //Lundi 3 Mars 2014
3.4.5. Utiliser une source de données texte csv, json
Un widget peut accéder à une source de données texte, ceci au moyen de la fonction
content.cacheUrlContent. Le traitement des données est à la charge du code javascript.
Exemple :
RCS 821 120 581 - N° SIRET 821 120 581 00011 - TVA FR1821120581 – – www.dedicast.fr – [email protected]
18
www.neotess.fr
Tél : + 33 (0) 477 91 21 91
Mail : [email protected]
url = "http://download.finance.yahoo.com/d/quotes.csv?s=" +
content.param("ticker") + "&f=sl1d1t1c1p2ohgv&e=.csv";
var csv = content.cacheUrlContent(url, 128, 3600, 43200);
var elem = csv.split(",");
if(elem[0] == "") { widget.nextContent(); return; }
tickerText.text = content.param("ticker") + " " + elem[1];
3.4.6. Utiliser une source de données xml
L’item QtQuick XmlListModel permet d’accéder à une source de données xml et de réaliser
son analyse. Exemple :
import QtQuick.XmlListModel 2.0
XmlListModel {
id: model
source: content.cachedParam("url")
query: "/rss/channel/item"
XmlRole { name: "title"; query: 'title/string()' }
XmlRole { name: "description"; query: 'description/string()' }
XmlRole { name: "image"; query: 'enclosure/@url/string()' }
onStatusChanged: {
if(status == XmlListModel.Error) { widget.nextContent();
}
if(status == XmlListModel.Ready) {
if(count<1) { widget.nextContent(); }
console.log("news count: " + count);
for(var i = 0; i < count; i++)
RCS 821 120 581 - N° SIRET 821 120 581 00011 - TVA FR1821120581 – – www.dedicast.fr – [email protected]
19
www.neotess.fr
Tél : + 33 (0) 477 91 21 91
Mail : [email protected]
console.log("news: " + model.get(i).title);
} } }
3.4.7. Inclure un contenu de la Bibliothèque
L’utilisateur peut choisir un contenu de la bibliothèque au moyen de propriété de type
CONTENT ou IMAGECONTENT. Dans widget.xml :
<param type="CONTENT" name="contenu" label="Un contenu de la Bibliotheque"/>
Celui-ci peut être inséré dans widget.qml. Exemple :
Content {
id: contentItem
anchors.fill: parent
source: content.param("contenu")
onContentEnd: { widget.nextContent(); }
}
3.5.
Référence
3.5.1. Item Widget
L’item QML Widget est utilisé comme la racine de tout widget. Il dispose des méthodes de
démarrage et d’arrêt du widget.
Méthodes :
start()
Réimplémentée dans le widget, est appelée à chaque démarrage de l’animation du widget.
Est utilisée pour démarrer les animations du widget, charger et analyser les données
externes, etc.
stop()
Réimplémentée dans le widget, est appelée avant le démarrage du contenu suivant.
RCS 821 120 581 - N° SIRET 821 120 581 00011 - TVA FR1821120581 – – www.dedicast.fr – [email protected]
20
www.neotess.fr
Tél : + 33 (0) 477 91 21 91
Mail : [email protected]
Est utilisée pour arrêter les animations du widget et décharger les objet volumineux en RAM
(pour libérer des ressources pour l’animation des autres contenus).
nextContent()
Déclenche la fin de l’affichage du widget en vue de l’affichage du contenu suivant.
Doit être appelé par le widget notamment dans les cas suivants :
3.5.2. Dans la méthode start() lorsque le widget n’est pas prêt à être affiché Objet
content
L’objet content est accessible globalement dans le code javascript du widget. Il donne accès
à des informations relatives au contenu.
Méthodes :
int content.width() : retourne la largeur de la zone dans laquelle est affiché le contenu
int content.height() : retourne la hauteur de la zone dans laquelle est affiché le contenu
int content.duration() : retourne la durée en secondes du contenu
bool content.isLoop() : retourne true si le contenu doit reboucler sur lui-même
string content.name() : retourne le nom du contenu dans la Bibliothèque
string content.url() : retourne l'url absolue du contenu dans le système de fichiers
string content.uuid() : retourne l'uuid associé au contenu
string content.param(nom du paramètre) : retourne la valeur du paramètre nommé ou
chaine vide si erreur. Le nom du paramètre est l'un de ceux déclarés dans widget.xml ; la
valeur est celle renseignée par l'utilisateur dans le fichier Contenu (anciennes appellations :
content.p())
string content.cacheParamFile(nom du paramètre) : si le nom du paramètre est
déclaré dans widget.xml comme de type RSS, et si le fichier se trouvant à l'URL saisie par
l'utilisateur a été correctement mis en cache et n'est pas expiré, alors retourne l'url absolue
de ce fichier dans la cache. Retourne une chaine vide si erreur (anciennes appellations :
content.pc() ou content.cachedParam())
RCS 821 120 581 - N° SIRET 821 120 581 00011 - TVA FR1821120581 – – www.dedicast.fr – [email protected]
21
www.neotess.fr
Tél : + 33 (0) 477 91 21 91
Mail : [email protected]
string content.cacheParamContent(nom du paramètre, int length) : comme
cacheParamFile, mais retourne les length premiers caractères du fichier, ou chaîne vide si
erreur.
string content.cacheUrlFile(url, int refresh, int expires) : demande la mise
en cache du fichier se trouvant à l'URL. Retourne l'url absolue de ce fichier dans la cache si le
fichier est déjà disponible et pas expiré ou chaine vide sinon. refresh est le délai en secondes
de rafraichissement de la cache. expires est l'âge en secondes après lequel le contenu en
cache est trop vieux pour être utilisé.
string content.cacheUrlContent(url, int length, int refresh, int expires) :
comme cacheUrlFile, mais retourne les length premiers caractères du fichier, ou chaîne vide
si erreur.
string content.skinName() : retourne le nom de la skin associee au contenu, ou une
chaine vide si aucune skin n'est sélectionnée
string content.skinAttribute(nom d'élément, nom d'attribut) : retourne la valeur
de l'attribut de l'élément du fichier skin.xml de la Skin sélectionnée. Pour cela, un param de
type SKINS doit être présent dans widget.xml.
string content.skinUrl(url) : url doit être le nom d'un fichier présent dans toutes les
skins du Widget. Retourne l'url absolue de ce fichier, dans le répertoire de la Skin
sélectionnée. Pour cela, un param de type SKINS doit être présent dans widget.xml.
int content.scaleX(int) : retourne la valeur int multipliée par l'étirement sur l'axe X
int content.scaleY(int) : retourne la valeur int multipliée par l'étirement sur l'axe Y
int content.scaleXY(int) : retourne la valeur int multipliée par l'étirement
homothétique
void content.log(string) : enregistre la chaîne string dans le log du processus NeoPlayer
string urlForContent(string) : retourne le chemin d’accès du contenu dont l’url
Neotess est string
3.5.3. Item SkinLayout (correspond aux composants SkinBackground ou SkinCell)
Une Skin auto-génère des composants QML SkinBackground et SkinCell qu’il est possible
d’insérer dans widget.qml.
RCS 821 120 581 - N° SIRET 821 120 581 00011 - TVA FR1821120581 – – www.dedicast.fr – [email protected]
22
www.neotess.fr
Tél : + 33 (0) 477 91 21 91
Mail : [email protected]
Ces composants contiennent eux-mêmes des items QtQuick enfants pré-paramétrés avec
les paramètres de la Skin et qu’il est possible de modifier dynamiquement.
Méthodes :
setProperty(areaName, property, value) : donne la valeur value à la propriété property
de l’item areaName
string getProperty(areaName, property) : retourne la valeur de la propriété property
de l’item areaName
setValue(areaName, value) : selon le type de l’item areaName, change le texte ou l’url de
l’image
string value(areaName) : selon le type de l’item areaName, retourne le texte ou l’url de
l’image
object area(areaName) : retourne l’élément QML nommé areaName
3.5.4. Objet SkinComponent
Propriété source
Propriété item
Propriété skin
3.5.5. Objet ShellItem
Propriété command
Méthode execute()
Méthode kill()
3.5.6. Objet ServerEventItem
Propriété interval (ms). Par defaut 15000
Propriété serverUrl
RCS 821 120 581 - N° SIRET 821 120 581 00011 - TVA FR1821120581 – – www.dedicast.fr – [email protected]
23
www.neotess.fr
Tél : + 33 (0) 477 91 21 91
Mail : [email protected]
Développer un Flash pour Neotess
Une animation Flash (fichier avec extension .swf) peut être est affichée par le Player Neotess.
Lorsque diffusée seule, elle est affichée à l'écran de manière permanente. Pour cette raison, il
est recommandé à son concepteur de réaliser une animation rebouclant sur elle-même.
Lorsque diffusée en Playlist ou en Template, elle est affichée à l'écran pendant la durée
spécifiée par l'utilisateur dans la Playlist ou la Template. Lorsque l'utilisateur n'est pas le
concepteur de l'animation, il lui est alors recommandé de mesurer la durée de l'animation
en secondes afin de préciser sa durée la plus juste dans la Playlist ou la Template.
Lorsqu'une animation est conçue pour son affichage sur Neotess, son concepteur peut alors
utiliser les fonctions de contrôle depuis le code de l'animation flash :
fonction javavascript firstFrame() : appelé au démarrage de l'animation, a pour effet d'ignorer
la durée spécifiée par l'utilisateur afin que l'animation ne soit pas interrompue
arbitrairement. Si elle n'est pas utilisée, alors l'utilisateur doit spécifier une durée de lecture
plus importante que la durée de l'animation afin que celle-ci ne soit pas interrompue avant
sa fin. Ceci peut être utilisé comme "Chien de garde" en cas de plantage de l'animation.
fonction javascript lastFrame() : appelé à la fin de l'animation, signale la fin de sa lecture. Il
déclenche la lecture du contenu suivant ou bien le redémarrage du contenu flash.
Exemple de code actionscript d'appel des fonctions fistFrame() et lastFrame():
//import de la class external
import flash.external.ExternalInterface ;
//nom de la fonction à appeler et le paramètre à passer
ExternalInterface.call("firstFrame");
ExternalInterface.call("lastFrame");
L'URL d'appel de l'objet flash contient un paramètre loop qui peut prendre les valeurs
suivantes
loop=true : l'animation est seule à être affichée et peut donc continuer à jouer ou
reboucler indéfiniment sans appeler la fonction lastFrame()
loop=false : l'animation n'est pas seule à jouer et doit donc appeler lastFrame() ou
bien sera terminée à l'écoulement du temps spécifié dans la Playlist ou la Template.
RCS 821 120 581 - N° SIRET 821 120 581 00011 - TVA FR1821120581 – – www.dedicast.fr – [email protected]
24