(lecture d'image) la molette fais des siennes !

Programmation d'applications complexes
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

(lecture d'image) la molette fais des siennes !

Message par graph100 »

yop !

J'ai codé une appli pour lire des dossiers contenants des images (comme des livres / BD / manga en scan), et, j'ai ajouté une fonction bibliothèque.

Mon problème se situe dans la bibliothèque :

- lorsqu'on lance la bibliothèque (bouton en haut à gauche de la fenêtre principale), la molette de la souris n'est pas prise en compte dans les évènements window !

explication :

la fenêtre de la bibliothèque se compose en une partie d'affichage de la 1ere page de chaque série entré dans la bibliothèque
et d'une partie comportant les boutons permettant l'ajout de série à partir de méthode différente, ainsi qu'une fonction de conversion de dossier en un fichier de type *.mgwa (copie de série plus rapide, gain de place sur le disque en évitant de perdre les clusters etc...)

la molette a pour but de monter et descendre les images affichées dans la partie noire.
ctrl + molette permet de zoomer sur les images

il faut pour constater un effet de la molette avoir rempli assez la bibliothèque pour avoir besoin de monter / descendre dans la liste. (on peut aussi utiliser le zoom pour grossir les images et donc en nécessiter moins)

le fait est que la molette ne renvoie pas d'évènement lorsqu'on lance la bibliothèque, pour qu'elle puisse fonctionner, il faut faire auparavant un click sur un bouton, rester le click enfoncé, puis enlever le curseur de la souris d'au dessus du bouton et lâcher.

Autant dire que c'est particulièrement compliqué et non ergonomique !!

Il me semble que ce problème est apparu après que j'ai ajouté la fonction de mise à jour des vignettes de la bibliothèque par un thread, ainsi qu'une fenêtre de progression. Mais je n'arrive pas trouver comment résoudre ça :roll:

- le chargement des vignettes est super long !!!! j'utilise en ce moment une bibliothèque d'environ 500 série, et ca met quand même 17 sec à charger toutes les images et les redimensionner en vignette

ma 2ème question est : est-il possible de faire ca plus rapidement ?
j'ai déjà modifier le programme pour que cette 1ere opération commence au lancement du programme dans un thread (en temps masqué), cependant lorsqu'on lance le programme c'est pour généralement aller chercher une série dans la bibliothèque !

--------
Si vous voyez quelque chose dans mon code qui vous choque, ou que vous feriez autrement, je serais ravi d'écouter votre avis :D
--------

[edit] ...
Dernière modification par graph100 le mar. 19/juil./2011 19:38, modifié 2 fois.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: (SCMangwa - lecture d'image) la molette fais des siennes

Message par graph100 »

:oops: :oops:

Je me rend compte maintenant que demander de lire tout ce code rébarbatif n'est pas forcement productif :roll:

:oops: :oops:

J'ai donc essayé d'isoler le problème : apparemment c'est du à un usage de la fonction DisableWindow()

voici un code qui isole le soucis :

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 500, 500, "W0", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
		ProgressBarGadget(0, 10, 240, 480, 20, 0, 100, #PB_ProgressBar_Smooth)
			SetGadgetState(0, 50)
			
		ButtonGadget(1, 10, 10, 480, 20, "TEST")
EndIf


;###################
; ces lignes sont à commenter pour voir la différence
DisableWindow(0, #True)

DisableWindow(0, #False)
;###################

; essayez de tourner la molette dans les deux cas --> avec les lignes commentées cela va faire bouger la barre de progression
; sinon il faut cliquer le bouton pour pouvoir le faire

Repeat
	event = WaitWindowEvent()
	
	;{ gestion de la molette
	
	If event = #WM_MOUSEWHEEL
		Molette.l= -(EventwParam() >> 16) / 120
		
		SetGadgetState(0, GetGadgetState(0) + Molette)
		
	EndIf
	;}
	
Until event = #PB_Event_CloseWindow

End
La fenêtre redeviens accessible à la sortie de DisableWindow(#, #False), cependant tout les évènements ne se produisent pas.
C'est délicat à gérer dans mon projet car l'utilisateur ne peux se servir que de la molette.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: (SCMangwa - lecture d'image) la molette fais des siennes

Message par case »

pour charger les vignettes et les afficher tu peux faire ça plus vite avec un cache. et des images deja redimensionnés...

si le fichier cache n'existe pas
tu récupère les chemins d’accès et les images de tes bd tu les reduis et tu stocke tout ca dans un gros fichier.

si le fichier existe tu le charge en mémoire, tu le parcours en mémoire pour récupérer tout les chemins dans une liste chainée
pour recuperer les vignettes tu fait un catchimage(adressememoire)

tu n'as donc plus besoin de redimentionner les images ...


pour ton souci de souris tu peux résoudre cela en rendant actif un gadget. contenu dans la fenêtre.

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 500, 500, "W0", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
      ProgressBarGadget(0, 10, 240, 480, 20, 0, 100, #PB_ProgressBar_Smooth)
         SetGadgetState(0, 50)         
      ButtonGadget(1, 10, 10, 480, 20, "TEST")
EndIf


;###################
; ces lignes sont à commenter pour voir la différence
DisableWindow(0, #True)

DisableWindow(0, #False)
;###################

; essayez de tourner la molette dans les deux cas --> avec les lignes commentées cela va faire bouger la barre de progression
; sinon il faut cliquer le bouton pour pouvoir le faire
SetActiveGadget(0) ; <-------------------------------------------------- ici
Repeat
   event = WaitWindowEvent()

   ;{ gestion de la molette
   
   If event = #WM_MOUSEWHEEL
      Molette.l= -(EventwParam() >> 16) / 120

      SetGadgetState(0, GetGadgetState(0) + Molette)
      
   EndIf
   ;}
   
Until event = #PB_Event_CloseWindow
End

ImageImage
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: (SCMangwa - lecture d'image) la molette fais des siennes

Message par graph100 »

ah ! un cache pour les images, tu le fais donc dans un seul fichier ?
Comment ferais tu pour mettre a jour le fichier sans le réécrire totalement ?
(si on enlève une image au milieu du fichier ?)

pour la souris, effectivement ça fonctionne bien avec le SetActiveGadget()
moi j'ai trouvé une api entre temps, mais j'aime pas trop les utiliser (puisque window only)
SetFocus_(WindowID(#))
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: (SCMangwa - lecture d'image) la molette fais des siennes

Message par case »

si tu enlève une image a la fin, tu peux tronquer le fichier juste avant mais dans tout les autres cas tu dois réécrire tout le fichier.
mais a mon avis ça restera toujours plus rapide que de lire chaque planche a chaque démarrage, créer la vignette etc...
ImageImage
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: (SCMangwa - lecture d'image) la molette fais des siennes

Message par graph100 »

j'ai fais la modif ;)
Du coup ça charge les 500 vignettes en à peut près 2-3 sec, ce qui tout à fais acceptable !

Pour le stockage des images j'ai juste créé les vignettes dans un dossier séparé pour pouvoir rapidement les effacer et les refaire.
Comme je ne le fais que si on supprime une série ça ne devrais pas créer de problème de fragmentation du disque ;>

Maintenant je vais tenter de fonctionner avec une database pour stocker les info concernant les séries, pour pouvoir les trier avec des
critères spécifiques, mais ça va être coton comme c'est pas une doc purebasic

si ça intéresse qqun je peux poster le programme compilé (le code est trop long ;s m'en suis rendu compte trop tard)
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: (SCMangwa - lecture d'image) la molette fais des siennes

Message par case »

tu crée une liste structurée.

par exemple

structure info
titre.s
auteur.s
date de publication.i
tome.i
serie.i
image.i
endstructure

newlist bd.info()


et quand tu veux trier par auteur de a à z par exemple tu peux utiliser

sortStructuredList(bd(),#PB_Sort_Ascending, OffsetOf(info\auteur), #PB_Sort_String)
ImageImage
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: (SCMangwa - lecture d'image) la molette fais des siennes

Message par graph100 »

bah c'est pour pouvoir faire des recherches facilement, par exemple : prendre toutes les séries de tel auteur, ou bien lister les auteurs, etc...

ça se programme sans trop de mal avec des listes chainées, simplement j'ai l'occasion d'aller tâter de la database et je voudrais voir ce que ça donne.
D'autant plus que je n'ai pas encore trouver comment rendre la bibliothèque agréable et ergonomique :cry:
Pour le moment c'est juste une grosse liste de série et l'affichage de leur 1ere page, donc on s'y perd un peu quand on en a beaucoup !

En gros je trouve ma bibliothèque moche et je voudrais pouvoir faire un système souple qui me permette des changements d'interface ;)
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Répondre