[..] GUI pour comparaison de fichier

Aide sur les Interfaces Graphique Utilisateurs (GUI).
Règles du forum
.
Répondre
jpascal
Niveau 5
Niveau 5
Messages : 138
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

[..] GUI pour comparaison de fichier

#1

Message par jpascal »

Bonjour à tous,

J'espère que le confinement n'est pas trop dur.
Par chance, AutoIt nous permet de passer le temps. :-)

Je viens vers vous, une fois n'est pas coutume, pour vous présenter un début de projet.
Je souhaite pouvoir comparer des fichiers et plus exactement des sous-titres.
Pour cela j'utilise deux listview et j'affiche les lignes différentes selon deux couleurs, rouge pour le texte et vert pour l'horodatage.

Avant d'aller plus loin, j'aurais souhaité avoir votre avis sur mon code, savoir s'il y a des choses à améliorer.

Lorsque je scrolle la coloration n'apparaît pas, je lance donc la fonction Colorize() à chaque fois. Je me demande s'il n'y a pas une meilleure façon de procéder.
Il y a un bug de décalage entre les deux listview lorsque je scrolle après avoir ajouter des lignes.

Je sais qu'il existe des outils bien plus performants pour ce genre de chose (WinMerge par exemple) mais pour des travaux bien spécifiques, ils montrent leur limite d'où l'intérêt de coder un outil perso.
Je pense en revanche qu'avec ma façon de procéder (utilisation de listview), je ne pourrai pas afficher le texte de différentes couleurs... Sauf si vous avez la solution miracle ! :D

Merci d'avance pour vos conseils avisés.
Fichiers joints
Comparator.au3
(11.83 Kio) Téléchargé 22 fois
Comparator.au3
(11.83 Kio) Téléchargé 22 fois
timingdif2.txt
(562 Octets) Téléchargé 23 fois
timingdif2.txt
(562 Octets) Téléchargé 23 fois
timingdif1.txt
(512 Octets) Téléchargé 22 fois
timingdif1.txt
(512 Octets) Téléchargé 22 fois
AutoIt 3.3.15.1 / SciTE 4.1.0 / Windows 7 & 10 x64

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5994
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] GUI pour comparaison de fichier

#2

Message par mikell »

La listview est un bon choix, mais plus un code est compliqué, plus ya des bugs, et plus c'est difficile à gérer
Et ton code, c'est : pourquoi faire simple quand on peut faire compliqué :mrgreen:
Un petit exemple vite fait ci-dessous
Après pour la gestion du texte, il manque des infos : est-ce qu'un sous-titre peut être sur plusieurs lignes, qu'est-ce que ton script doit réaliser précisément, etc

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>

GUICreate("Form1", 500, 240)
$LV1 = GUICtrlCreateListView("col1   |col2   ", 8, 10, 200, 210)
For $i = 0 To 29
     GUICtrlCreateListViewItem("item "& $i & "|" & "subitem "& $i, $LV1)
     If Mod($i, 2) = 0 Then GUICtrlSetBkColor(-1, 0xFFCCCC)
     If Mod($i, 3) = 0 Then GUICtrlSetBkColor(-1, 0xCCFFCC)
Next
$LV2 = GUICtrlCreateListView("col1   |col2   ", 210, 10, 200, 210)
For $i = 0 To 29
     GUICtrlCreateListViewItem("item "& $i & "|" & "subitem "& $i, $LV2)
     If Mod($i, 2) = 0 Then GUICtrlSetBkColor(-1, 0xFFCCCC)
     If Mod($i, 3) = 0 Then GUICtrlSetBkColor(-1, 0xCCFFCC)
Next
$aRect = _GUICtrlListView_GetItemRect($LV2, 0)
$iDeltaY = $aRect[3] - $aRect[1]
GUISetState()

GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")

While 1
    If GUIGetMsg() = $GUI_EVENT_CLOSE Then Exit
WEnd

Func _WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
   If $wparam = $LV2 Then
   $iLines = _GUICtrlListView_GetTopIndex($LV2) - _GUICtrlListView_GetTopIndex($LV1)
   _GUICtrlListView_Scroll ($LV1, 0, $iLines * $iDeltaY)
  ElseIf $wparam = $LV1 Then
   $iLines = _GUICtrlListView_GetTopIndex($LV1) - _GUICtrlListView_GetTopIndex($LV2)
   _GUICtrlListView_Scroll ($LV2, 0, $iLines * $iDeltaY)
  EndIf
   Return "GUI_RUNDEFMSG"
EndFunc   ;==>_WM_Notify
 
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

jpascal
Niveau 5
Niveau 5
Messages : 138
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

Re: [..] GUI pour comparaison de fichier

#3

Message par jpascal »

Simple, concis, quoi dire de plus si ce n'est merci. :-)

J'avoue que mon code c'est un peu machine à gaz. :lol:

J'ai utilisé un sous-item pour gérer le type de donnée de la ligne mais en effet, dans ma façon de voir les choses, qu'il y a ait une ou deux lignes de sous-titres, j'en afficherai toujours deux pour pouvoir comparer.
Et la fonction Mod() est donc parfaite pour cela. ;-)

Concernant le déplacement synchrone dans les deux listview, je ne connaissais pas la fonction _GUICtrlListView_GetItemRect().
Cela me servira dans d'autre cas où je fixe la hauteur des listview au lieu de la calculer.
Et le code dans WM_NOTIFY est :)

Enfin pour ce qui de la colorisation, j'ai utilisé le code que l'on m'avait conseillé il y a quelques temps.
Mais s'il est complexe, c'est qu'il permet de coloriser un item et un sous-item avec une couleur différente.
Là encore, vu que toute la ligne sera de la même couleur, un GUICtrlSetBkColor() suffit.

Après, si en effet je souhaite pouvoir colorer le texte différemment sur une même ligne, je parle bien du texte pas du fond, est-ce envisageable ?
Exemple :
Bonjour JOHN ! <> Bonjour J0HN I
Si oui j'imagine qu'il faut que je conserve et adapte le code "usine à gaz" de WM_NOTIFY ?
AutoIt 3.3.15.1 / SciTE 4.1.0 / Windows 7 & 10 x64

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11556
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] GUI pour comparaison de fichier

#4

Message par Tlem »

Bonsoir.
pouvez vous nous expliquer en quoi votre programme sera plus intéressant ou plus pratique que Winmerge, car celui-ci est quand même très largement utilisé pour ce genre de fonctionnalité. ^^
Sans compter les possibilité de paramétrages qui permettent d'adapter le logiciel à un large éventail de besoins. ^^
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

jpascal
Niveau 5
Niveau 5
Messages : 138
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

Re: [..] GUI pour comparaison de fichier

#5

Message par jpascal »

Bonsoir Thierry,

Lorsque deux fichiers n'ont pas les mêmes horodatages de sous-titre, il serait intéressant de ne pas afficher ces différences et se concentrer sur les différences de texte.

De plus, parfois WinMerge s'emmêle les pinceaux lorsque des sous-titres sont trop différents et la comparaison devient inexploitable.
La solution consiste à insérer un ou plusieurs sous-titres vides de manière à retrouver les sous-titres à comparer face à face.
L'outil permettrait de pouvoir le faire facilement (ajout de 4 lignes avec un seul bouton).

Et bien sûr, un codage perso permet d'ajouter des fonctionnalités qui ne seront jamais dans WinMerge.
En l’occurrence, j'ai ajouté un contrôle pour ajouter ou retrancher un temps à tous les sous-titres (cela existe peut-être sur WinMerge mais j'avoue ne pas l'avoir lancé depuis un moment).

Mon but n'est pas de faire un nouveau WinMerge mais un outil limité à ce qu'il doit faire.

Je me doute qu'AutoIt n'est pas adapté en terme de vitesse de traitement mais je trouve intéressant de chercher à faire ce genre de choses.
AutoIt 3.3.15.1 / SciTE 4.1.0 / Windows 7 & 10 x64

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11556
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] GUI pour comparaison de fichier

#6

Message par Tlem »

OK. Merci pour les explications.
Bonne continuation.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5994
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] GUI pour comparaison de fichier

#7

Message par mikell »

Hum je me rends compte que j'aurais dû moduler ma réponse autrement Image
En principe, la démarche la plus logique est de d'abord définir précisément toutes les fonctionnalités désirées (tout ce que le script doit être capable de réaliser), puis la manière optimale de mettre ces fonctionnalités en oeuvre (avec leurs interactions possibles)
Optimale = le rapport efficacité/simplicité le plus haut
Après on peut s'intéresser aux aspects cosmétiques, ce n'est pas le plus difficile, le degré de complexité sera dicté par les impératifs précédents . Si tu dois colorer des subitems évidemment tu ne peux pas éviter le NM_CUSTOMDRAW. Colorer uniquement une partie de subitem, je ne sais pas si c'est possible ou pas
Mon petit script précédent est un poil caricatural, parce qu'il ne prend absolument pas en compte ces fameuses fonctionnalités du script qui sont requises Image
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

jpascal
Niveau 5
Niveau 5
Messages : 138
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

Re: [..] GUI pour comparaison de fichier

#8

Message par jpascal »

Au contraire, votre réponse a mis le doigt sur l'essentiel, il est inutile de sortir un bazooka pour tuer une mouche !

J'avoue que j'aime bien partir sur une idée puis chemin faisant, le nombre de fonctionnalités augmentant, il devient obligatoire de modifier le code.
Cela requiert du temps certes mais cela permet de faire évoluer son projet petit à petit.
En partant sur un projet complexe, c'est plus difficile de tenir sur la durée. Là au moins, j'ai la satisfaction de pouvoir tester chaque nouvelle fonctionnalité et d'avoir un outil certes limité mais fonctionnel.

Je pense ne pas avoir besoin de colorer le back des sous-items.
Mais si tu trouves comment faire pour colorer une partie du texte je suis plus que preneur. ;-)
Encore merci pour l'aide apportée.


Dois-je passer le sujet en résolu ? Et si oui aurai-je la possibilité de revenir ici pour apporter un complément ou poser des questions supplémentaires ?
AutoIt 3.3.15.1 / SciTE 4.1.0 / Windows 7 & 10 x64

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5994
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] GUI pour comparaison de fichier

#9

Message par mikell »

Le titre du sujet est explicite et suffisamment général pour que d'autres questions concernant ce projet puissent logiquement s'y inscrire
Et oui j'avoue que ça m'intéresserait de voir comment ce script va évoluer

C'est bien utile aussi parfois un bazooka :mrgreen:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

jpascal
Niveau 5
Niveau 5
Messages : 138
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

Re: [..] GUI pour comparaison de fichier

#10

Message par jpascal »

Bonjour,

Occupé par d'autres projets, je ne remets le nez dans celui-ci qu'aujourd'hui.

J'ai une question à propos des ListViewItem.

Lorsqu'on crée chaque ligne de la ListView, c'est associé à un Control ID.
Dans le code, on définit immédiatement la couleur :
     GUICtrlCreateListViewItem("item "& $i & "|" & "subitem "& $i, $LV2)
     If Mod($i, 2) = 0 Then GUICtrlSetBkColor(-1, 0xFFCCCC)
     If Mod($i, 3) = 0 Then GUICtrlSetBkColor(-1, 0xCCFFCC)
Mais si je souhaite la modifier plus tard, comment dois-je procéder ?

Avec l'UDF GUICtrlListView, je ne vois pas comment. Avec _GUICtrlListView_MapIndexToID() ?
Je pourrais créer un tableau contenant Row ListView | ID Control mais j'imagine qu'il y a plus simple ?
AutoIt 3.3.15.1 / SciTE 4.1.0 / Windows 7 & 10 x64

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5994
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] GUI pour comparaison de fichier

#11

Message par mikell »

ça dépend du script et de ce qu'on y réalise
Basiquement, un tableau 2D avec ID des items / texte des items c'est souvent utile, mais la plupart du temps un changement de couleur "à la volée" se fait dans le WM_NOTIFY avec NM_CUSTOMDRAW
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

Répondre