Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
utilisateurs:quent57:tutoriel:singlet_unity_lens [Le 30/01/2013, 21:17] – quent57 | utilisateurs:quent57:tutoriel:singlet_unity_lens [Le 02/02/2013, 15:54] (Version actuelle) – [Les types de catégories] quent57 | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ====== Création d'une lentilles (lens) pour unity ====== | ||
+ | Il est conseillé de déjà consulter ce tutoriel, pour acquérir les bases, cette pages expliquera comment utiliser plus en profondeur la librairie singlet | ||
+ | ===== Aperçus des fonctionnalités disponibles ===== | ||
+ | L' | ||
+ | Le projet sera facilement compilable pour pouvoir réellement visualiser et tester toutes les possibilités de des lenses unity. | ||
+ | Ce tutoriel ne contiendra pas d' | ||
+ | |||
+ | Nous nous appuierons sur singlet, une librairie que permet de créer plus facilement des lens et scope unity. | ||
+ | |||
+ | ==== Création d'un projet ==== | ||
+ | |||
+ | <code bash> | ||
+ | quickly create unity-lens tutorial | ||
+ | </ | ||
+ | |||
+ | Maintenant utilisons cette nouvelle lens : | ||
+ | <code bash> | ||
+ | cd tutorial | ||
+ | sudo quickly install | ||
+ | quickly run | ||
+ | </ | ||
+ | Et aller voir dans le Tableau de Bord (Dash) | ||
+ | |||
+ | ==== Les types de catégories ==== | ||
+ | |||
+ | Nous avons actuellement une seul catégorie d' | ||
+ | |||
+ | Ouvrir le fichier | ||
+ | tutorial/ | ||
+ | |||
+ | On observe dans ce fichier | ||
+ | example_category = ListViewCategory(" | ||
+ | Cela correspond donc à cette catégorie. | ||
+ | |||
+ | Nous allons la renommer et ajouter tous les types connus. | ||
+ | |||
+ | La doc officielle des type de catégories ((http:// | ||
+ | * VERTICAL_TILE | ||
+ | * HORIZONTAL_TILE | ||
+ | * LIST_TILE | ||
+ | * FLOW | ||
+ | Mais singlet que 2 : | ||
+ | * IconViewCategory | ||
+ | * ListViewCategory (HORIZONTAL_TILE) | ||
+ | |||
+ | remplacer cette ligne par ce code, la méthode permet de peupler une catégorie : | ||
+ | <code python> | ||
+ | list_view_category = ListViewCategory(" | ||
+ | icon_view_category = IconViewCategory(" | ||
+ | | ||
+ | | ||
+ | def populate_category(self, | ||
+ | for i in xrange(15): | ||
+ | results.append(' | ||
+ | ' | ||
+ | | ||
+ | " | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | results.append(' | ||
+ | ' | ||
+ | category, | ||
+ | " | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | </ | ||
+ | |||
+ | Remplaçons le contenu de la méthode search par : | ||
+ | <code python> | ||
+ | self.populate_category(self.list_view_category, | ||
+ | self.populate_category(self.icon_view_category, | ||
+ | </ | ||
+ | |||
+ | Et comme on parle français et qu'on a envie de pouvoir mettre des accents utf-8, ajouter un première ligne du fichier : | ||
+ | <code ptyhon> | ||
+ | # -*-coding: | ||
+ | </ | ||
+ | |||
+ | Testez ! | ||
+ | |||
+ | Alors ok, ça fonctionne et on observe 2 types de catégorie, essayons quand même les autres (singlet nous le permet, et c'est tant mieux !) ! | ||
+ | |||
+ | <code python> | ||
+ | list_tile_category = Category(" | ||
+ | flow_category = Category(" | ||
+ | </ | ||
+ | <code python> | ||
+ | self.populate_category(self.list_tile_category, | ||
+ | self.populate_category(self.flow_category, | ||
+ | </ | ||
+ | |||
+ | Nous ajouterons aussi les 2 imports suivants : | ||
+ | <code python> | ||
+ | from singlet.lens.category import Category | ||
+ | from gi.overrides.Unity import Unity | ||
+ | </ | ||
+ | |||
+ | Testez ! | ||
+ | |||
+ | Bon, ok on comprend pourquoi il n' | ||
+ | |||
+ | |||
+ | <note help> | ||
+ | |||
+ | En effet, ce sont juste des membre de notre classe ! </ | ||
+ | |||
+ | Il utilise pour cela l' | ||
+ | <code python> | ||
+ | for aName, a in attrs.items(): | ||
+ | if isinstance(a, | ||
+ | new_class._meta.scope_dict[aName] = a | ||
+ | if not hasattr(meta, | ||
+ | new_class._meta.scope_order.append(aName) | ||
+ | |||
+ | elif isinstance(a, | ||
+ | new_class._meta.category_dict[aName] = a | ||
+ | if not hasattr(meta, | ||
+ | new_class._meta.category_order.append(aName) | ||
+ | setattr(new_class, | ||
+ | |||
+ | elif isinstance(a, | ||
+ | new_class._meta.filter_dict[aName] = a | ||
+ | if not hasattr(meta, | ||
+ | new_class._meta.filter_order.append(aName) | ||
+ | |||
+ | else: | ||
+ | setattr(new_class, | ||
+ | </ | ||
+ | |||
+ | On vois ici que elif isinstance(a, | ||
+ | |||
+ | Le code ci dessus montre aussi pourquoi nous avons accès aux variables de class dans notre object (self.categorie), | ||
+ | |||
+ | |||
+ | On voit aussi un autre détail, on peux définir une certaine variable category_order . | ||
+ | On vas donc essayer de la définir pour afficher nos catégories dans le meme ordre que ci dessus, car ce n'est pas le cas. | ||
+ | |||
+ | Pour cela, ajouter dans la classe Meta : | ||
+ | <code python> | ||
+ | category_order=[' | ||
+ | </ | ||
+ | Réinstaller la lens, la lancer, on a bien nos catégories dans le bon ordre :) | ||
+ | | ||
+ | |||
+ | ==== Les filtres ==== | ||
+ | On vois ci dessus que l'on peux aussi définir des filtres | ||
+ | |||
+ | Suivant la doc, voici l' | ||
+ | * Unity.Filter | ||
+ | * Unity.RatingsFilter | ||
+ | * Unity.OptionsFilter | ||
+ | * Unity.RadioOptionFilter | ||
+ | * Unity.CheckOptionFilterCompact | ||
+ | * Unity.CheckOptionFilter | ||
+ | * Unity.MultiRangeFilter | ||
+ | |||
+ | Voila qui est intéressant, | ||
+ | |||
+ | On ajoutera aussi l' | ||
+ | <code pyhon> | ||
+ | from gi.overrides.Gio import Gio | ||
+ | </ | ||
+ | |||
+ | Alors, quelques éléments a savoir a propos des filtres, je n'ai aucune référence pour ces affirmations a pars mes propres essais : | ||
+ | - On ne peux pas ajouter d' | ||
+ | |||
+ | C'est très important car cela signifie que si on ajoute ces filtres en tant que membre de la classe, il *faut* qu'ils aient déja tous leur éléments ! | ||
+ | |||
+ | Donc je propose d' | ||
+ | <code python> | ||
+ | def populate_option_filter(option_filter): | ||
+ | for i in xrange(3): | ||
+ | title=" | ||
+ | option_filter.add_option(title, | ||
+ | </ | ||
+ | |||
+ | ensuite, ajouter en dessous des catégories non filtres : | ||
+ | <code python> | ||
+ | ratings_filter = Unity.RatingsFilter.new(" | ||
+ | " | ||
+ | | ||
+ | True) | ||
+ | radio_option_filter = Unity.RadioOptionFilter.new(" | ||
+ | " | ||
+ | | ||
+ | True) | ||
+ | check_option_compact_filter = Unity.CheckOptionFilterCompact.new(" | ||
+ | " | ||
+ | | ||
+ | True) | ||
+ | check_option_filter = Unity.CheckOptionFilter.new(" | ||
+ | " | ||
+ | | ||
+ | True) | ||
+ | multi_range_filter = Unity.MultiRangeFilter.new(" | ||
+ | " | ||
+ | | ||
+ | True) | ||
+ | populate_option_filter(radio_option_filter) | ||
+ | populate_option_filter(check_option_compact_filter) | ||
+ | populate_option_filter(check_option_filter) | ||
+ | populate_option_filter(multi_range_filter) | ||
+ | #rating no need to be fillful | ||
+ | </ | ||
+ | |||
+ | Ok, on peux observer les différence :) | ||
+ | |||
+ | Pour récupérer les valeurs des filtres et pour en ajouter a posteriori, singlet n'est pas encore pres, nous allons donc devoir attendre un peu. |