Utilisation des fonctions d'interaction avec Modern UI
Tutorial pour utilisateurs avancés
Prérequis
L'utilisation de Modern UI permet de réaliser des installations graphiquement agréables à utiliser. Seulement, il peut aussi être indispensable pour le développeur de contrôler le processus d'installation.
Il n'est plus possible d'utiliser les commandes de NSIS pour ajouter des fonctions d'interaction sur les pages prédéfinies de MUI.
Note
Modern UI n'empêche pas l'utilisation de la commande permettant de créer des pages personnalisées, avec leurs propres fonctions d'interaction :
Page custom fonction_create fonction_leave titre
Cette méthode fonctionne cependant plus difficilement avec les différentes pages préconstruites de Modern UI (Welcome, License, Components, Directory, Install, Finish et leurs équivalents pour la désinstallation)
Un contrôle quasi complet
La documentation de Modern UI indique comment contrôler les pages PRE, SHOW et LEAVE de chacune des pages de l'installation. Chacune ? Non, car une minorité résiste encore :
la page concernant le Menu Démarrer ne comprend pas de fonction SHOW personnalisable
Principe
Avant chacune des pages, il est possible de définir les fonctions d'interaction pour la page en question. Ce n'est pas cependant pas obligatoire.
!define MUI_PAGE_CUSTOMFUNCTION_PRE ma_fonction_pre_personnalisee !define MUI_PAGE_CUSTOMFUNCTION_SHOW ma_fonction_show_personnalisee !define MUI_PAGE_CUSTOMFUNCTION_LEAVE ma_fonction_leave_personnalisee
Attention : pour les pages de désinstallation, les noms des fonctions doivent commencer par un.
Exemple de script (sans la macro)
Mise en application :
!define MUI_PAGE_CUSTOMFUNCTION_PRE licence_pre !insertmacro MUI_PAGE_LICENSE "licence.rtf" !define MUI_PAGE_CUSTOMFUNCTION_PRE composants_pre !define MUI_PAGE_CUSTOMFUNCTION_LEAVE composants_leave !insertmacro MUI_PAGE_COMPONENTS !define MUI_PAGE_CUSTOMFUNCTION_LEAVE repertoire_leave !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES ; Exemple de fonctions Function licence_pre StrCmp $R0 "1" +1 +2 Abort ; Annulation de l'affichage de la page, on passe directement à la suivante FunctionEnd Function composants_pre MessageBox MB_OK "Choisissez judicieusement" FunctionEnd Function composants_leave StrCmp $R1 "1" +1 +2 MessageBox MB_OK "Les composants ont été sélectionnés" FunctionEnd Function repertoire_leave IfFileExists "$INSTDIR\fichier.exe" +3 +1 MessageBox MB_OK "Un fichier est manquant dans ce répertoire... choisissez-en un autre !" Abort ; On ne quitte pas la page FunctionEnd
Cet exemple est simple, et reste réalisable : il est toutefois possible de l'améliorer en évitant d'avoir plusieurs lignes pour définir les différentes fonctions d'interaction.
Une macro pour simplifier
La macro suivante, exclusivitée de NSIS fr, permet de définir en une ligne les trois fonctions d'interaction :
!macro NSISFR_MUI_FONCTIONS_INTERACTION_ADD_NEW_FUNCTION NAME TODEFINE TOCALL !insertmacro MUI_UNSET "${TODEFINE}" !ifndef NSISFR_MUI_FONCTIONS_INTERACTION_ADD_NEW_FUNCTION_DEFAULT !define NSISFR_MUI_FONCTIONS_INTERACTION_ADD_NEW_FUNCTION_DEFAULT Function "_" FunctionEnd !endif !insertmacro MUI_DEFAULT "${TODEFINE}" "${NAME}" Function "${NAME}" Push $R0 StrCmp ${TOCALL} "_" "label_${NAME}" Call ${TOCALL} label_${NAME}: Pop $R0 FunctionEnd !macroend !macro NSISFR_MUI_FONCTIONS_INTERACTION PRE SHOW LEAVE !insertmacro NSISFR_MUI_FONCTIONS_INTERACTION_ADD_NEW_FUNCTION "_MUI_PRE_${__LINE__}" "MUI_PAGE_CUSTOMFUNCTION_PRE" "${PRE}" !insertmacro NSISFR_MUI_FONCTIONS_INTERACTION_ADD_NEW_FUNCTION "_MUI_SHOW_${__LINE__}" "MUI_PAGE_CUSTOMFUNCTION_SHOW" "${SHOW}" !insertmacro NSISFR_MUI_FONCTIONS_INTERACTION_ADD_NEW_FUNCTION "_MUI_LEAVE_${__LINE__}" "MUI_PAGE_CUSTOMFUNCTION_LEAVE" "${LEAVE}" !macroend
Note : elle peut sembler un peu complexe, mais devrait fonctionner dans tous les cas (à vérifier).
Exemple de script (avec macro)
Voici un exemple mettant en application les fonctionnalités de la macro :
!insertmacro MUI_PAGE_LICENSE "licence.rtf" !insertmacro NSISFR_MUI_FONCTIONS_INTERACTION "_" "_" "composants_leave" !insertmacro MUI_PAGE_COMPONENTS !insertmacro NSISFR_MUI_FONCTIONS_INTERACTION "_" "_" "repertoire_leave" !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES ; Exemple de fonctions Function licence_pre StrCmp $R0 "1" +1 +2 Abort ; Annulation de l'affichage de la page, on passe directement à la suivante FunctionEnd Function composants_leave StrCmp $R1 "1" +1 +2 MessageBox MB_OK "Les composants ont été sélectionnés" FunctionEnd Function repertoire_leave IfFileExists "$INSTDIR\fichier.exe" +3 +1 MessageBox MB_OK "Un fichier est manquant dans ce répertoire... choisissez-en un autre !" Abort ; On ne quitte pas la page FunctionEnd
Note : les paramètres ne doivent jamais être vides : le "_" spécifie qu'aucune fonction ne doit être utilisée.
Une idée de pas à pas ?
Contactez Julien.
