From e27013a584b486480acb2e7dc6845fc23af5c688 Mon Sep 17 00:00:00 2001 From: luevard Date: Sun, 22 Oct 2023 18:49:43 +0200 Subject: [PATCH] :sparkles: Modification du Readme --- README.md | 153 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 102 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index 54e17f9..8ed0ca4 100644 --- a/README.md +++ b/README.md @@ -7,59 +7,110 @@ - Les VM applicatives sont à l'intérieur du projet MAUI, dans le dossier [_**Applicative_VM**_]("https://codefirst.iut.uca.fr/git/lucas.evard/PocketBook/src/branch/master/sources/PocketBook/Applicative_VM"). - Les VM wrappant les classes du modèle sont présent dans une bibliothèque de classes externe au projet MAUI, dans le dossier [_**ViewModel**_]("https://codefirst.iut.uca.fr/git/lucas.evard/PocketBook/src/branch/master/sources/ViewModel"). +Il n'y a aucune dépendance entre le modèle et la vue. + ## Mon toolkit MVVM -Un toolkit MVVM a été mis en place afin de soulager les écritures redondantes pour wrapper le modèle et pour la gestion des modification de propriétés. +Un toolkit MVVM a été mis en place afin de soulager les écritures redondantes pour wrapper le modèle et pour la gestion des modification de propriétées. + +```mermaid + +--- +title: Intégration du toolkit au projet => Package MyToolkitMVVM +--- + classDiagram -class RelayCommand { - +execute: Action - +canExecute: Func - -CanExecuteChanged: EventHandler? - +RelayCommand(execute: Action, canExecute: Func) - +CanExecute(parameter: object?): bool - +Execute(parameter: object?): void -} - -class RelayCommand { - -baseRelayCommand: RelayCommand - +RelayCommand(execute: Action, canExecute: Func) - +Execute(): async Task -} - -class ObservableObject { - +PropertyChanged: PropertyChangedEventHandler? - +OnPropertyChanged(propertyName: string): void - +SetProperty(ref member: T, value: T, propertyName: string): void - +SetProperty(member: T, value: T, action: Action, propertyName: string): void -} - -class BaseViewModel { - +Model: TModel - -model: TModel - +BaseViewModel(model: TModel) - +BaseViewModel() -} - -class BaseViewModel { -} - -RelayCommand <|-- RelayCommand -ObservableObject <|-- BaseViewModel -BaseViewModel <|-- BaseViewModel - - -- Navigation -- La plupart des pages -- Utilisation de vues différentes -- Création de vues personnalisées -- Utilisation des fichiers de ressources (couleurs/styles) -- Utilisation des polices d'écriture -- Thème sombre (besoin de reload l'application pour que les images s'affiche de la bonne couleur) - -## Ce qui ne fonctionne pas - -- Le menu contextuel lorsque l'on appuie sur le "+" -- La gestion des onglets dans la page "Emprunts et Prêts" -- Le rendu entre Android et iOS diffère sur certaines images \ No newline at end of file + class BaseViewModel~T~{ + +TModel Model + -TModel model + +BaseViewModel(model: TModel) + +BaseViewModel():this(default(TModel)) + } + + class BaseViewModel{ + + BaseViewModel() + } + + class ObservableObject{ + +PropertyChangedEventHandler? PropertyChanged; + #OnPropertyChanged(propertyName: string) + #SetProperty~T~(member: T ref, value: T, propertyName: string) + #SetProperty~T~(member: T, value: T,action Action~T~, propertyName: string) + } + + class RelayCommand~T~ { + +CanExecuteChanged: EventHandler + -execute: Action + -canExecute: Func + +RelayCommand(Action execute, Func canExecute) + +CanExecute(object? parameter): bool + +Execute(object? parameter): void + } + + class RelayCommand { + -execute: Action + -canExecute: Func + +RelayCommand(Action execute, Func canExecute) + +Execute(): Task + } + + + class INotifyPropertyChanged{ + <> + } + + class ICommand{ + <> + } + + + RelayCommand --|> ICommand + ObservableObject --|> INotifyPropertyChanged + BaseViewModel --|> ObservableObject + +``` + +Ensuite, il suffit de choisir s'il faut hériter de BaseViewModel qui est générique, ou BaseViewModel. + +Pour ma part, mes VM wrapper héritent automatiquement de BaseViewModel avec T désignant la classe du modèle à wrapper. + +Cependant, mes VM applicatives n'héritent pas forcément de BaseViewModel, je le fais hériter seulement lorsqu'une propriétée doit être bindée dans la vue, comme pour ButtonsVM. + +## Vue + +Concernant la vue, j'ai repris certains de vos composants: +- Prêt/Emprunts => le bouton en forme de switch +- Le bouton pour scanner un ISBN ou le saisir + +J'ai repris certaines de mes vues afin de mettre en place la ToolbarItem. + +La note des livres sont ramenée en nombre entier le plus proche. Ce qui implique que les étoiles sont affichées seulement pleines ou vides. + +## Bugs + +En jouant avec la liste de livres, et en naviguant sur d'autres pages (tous,favoris,filtres et à lire plus tard), il est possible que le rendu des étoiles dans le détail des livres soit faux. + +Si on ne commence pas l'affichage de la liste de livres par la page **tous**, il est possible que la liste s'affiche avec une hauteur très réduite. + +## Ce qui est implémenté + +En prenant compte votre Readme, il y a : +- La navigation en utilisant des **Commands** +- Mise en place de **ContentView ** +- Affichage de la **listes de livres** et **sélection d'un livre** +- Affichage entièrement bindé des **détails d'un livre** +- **Filtrage** par Auteur,Note et Date de publication +- **Changement de statut** d'un livre +- **Ajout d'un livre aux favoris**, il suffit d'aller dans l'onglet déplacer un livre et appuyer sur '_Déplacer en favoris_' +- Ajout d'un livre par ISBN +- **Supprimer un livre**, il suffit d'aller dans l'onglet déplacer un livre et appuyer sur '_Mettre à la poubelle_' +- Gestion de la **pagination** + +## Ce qui n'as pas été implémenté + +En prenant compte votre Readme, il y a : +- **Prêt** d'un livre +- Utilisation du **MVVM Community Toolkit** +- **Scanner ISBN**