SplitterScrolling(Gadget.i)

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Jacobus
Messages : 1641
Inscription : mar. 06/avr./2004 10:35
Contact :

SplitterScrolling(Gadget.i)

Message par Jacobus »

Hello, voici un petit exemple d'interactions de plusieurs gadgets entre eux.
Ici c'est la commande d'un SplitterGadget() autrement qu'avec la barre de séparation.
Voilà, si ça peut vous servir, faites en bon usage :)

Code : Tout sélectionner

;-TOP
;======================================
; SplitterScrolling(Gadget.i)
;
; Interaction de plusieurs gadgets
; Chacun des 4 gadgets commande les 3 autres
;
; Le programme consiste à commander un SplitterGadget() de plusieurs manières.
; et indirectement à commander TrackBarGadget() et SpinGadget() de plusieurs manières aussi.
;
; Jacobus 23/05/2026 PB 6.40
; Windows 11 64bits
;======================================

Enumeration
  #WIN
  #Bouton1   
  #Bouton2 
  #Separator
  #Adjustmentbar 
  #TextSplit
  #TextLevel
  #TextSpinUnite
  #SpinUnite
  #TextSpinTen
  #SpinTen
EndEnumeration

Procedure SplitterScrolling(Gadget.i)
  ; Dans cette procédure tous les gadgets vont être en interaction
  ; Pour adapter le pourcentage aux autres gadgets
  ; il est nécessaire de diviser la hauteur du SplitterGadegt() par 100
  ; Pour un splitter vertical il faudrait biensûr diviser la largeur par 100
  Height = GadgetHeight(#Separator) 
  Unite.f = Height/100          
  UniteF$ = StrF(Unite, 2) ; important de prendre 2 chiffres après la virgule pour un ajustement précis
  
  If Gadget = #Adjustmentbar
    TrackbarLevel = GetGadgetState(#Adjustmentbar)
    SetGadgetState(#Separator, TrackbarLevel * ValF(UniteF$)) ; on multiplie le niveau de la trackbar par l'unité obtenue
    Splitlevel = GetGadgetState(#Separator)
    SetGadgetText(#TextLevel, "Level = "+Str(TrackbarLevel) + " %")
    SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
    SetGadgetState(#SpinUnite, TrackbarLevel)
    SetGadgetState(#SpinTen, TrackbarLevel)
    
  ElseIf Gadget = #SpinUnite
    Spinlevel = GetGadgetState(#SpinUnite)
    SetGadgetState(#Separator, Spinlevel * ValF(UniteF$)) ; on multiplie le niveau du spingadget par l'unité obtenue
    SetGadgetState(#SpinTen, Spinlevel)
    Splitlevel = GetGadgetState(#Separator)
    SetGadgetText(#TextLevel, "Level = "+Str(Spinlevel) + " %")
    SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
    SetGadgetState(#Adjustmentbar, Spinlevel)
    
  ElseIf Gadget = #SpinTen
    SpinTlevel = GetGadgetState(#SpinTen)
    SetGadgetState(#Separator, SpinTlevel * ValF(UniteF$)) ; on multiplie le niveau du spingadget par l'unité obtenue
    Splitlevel = GetGadgetState(#Separator)
    SetGadgetText(#TextLevel, "Level = "+Str(SpinTlevel) + " %")
    SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
    SetGadgetState(#Adjustmentbar, SpinTlevel)
    SetGadgetState(#SpinUnite, SpinTlevel)
    
  ElseIf Gadget = #Separator
    Splitlevel = GetGadgetState(#Separator)
    SetGadgetState(#SpinUnite, Splitlevel/ValF(UniteF$)) ; par contre ici on est obligé de diviser la valeur du splittergadget par l'unité obtenue
    SetGadgetState(#SpinTen, Splitlevel/ValF(UniteF$))
    SetGadgetState(#Adjustmentbar, Splitlevel/ValF(UniteF$))
    TrackbarLevel = GetGadgetState(#Adjustmentbar)
    SetGadgetText(#TextLevel, "Level = "+Str(TrackbarLevel) + " %")
    SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
  EndIf 

EndProcedure

If OpenWindow(#WIN, 0, 0, 300, 300, "SplitterGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
         
    ButtonGadget(#Bouton1, 0, 0, 0, 0, "Bouton 1") ; Inutile de préciser la taille ou les coordonnées
    ButtonGadget(#Bouton2, 0, 0, 0, 0, "Bouton 2") ; car elles seront déterminées automatiquement
    SplitterGadget(#Separator, 5, 5, 290, 130, #Bouton1, #Bouton2, #PB_Splitter_Separator)
    
    TrackBarGadget(#Adjustmentbar, 5, 140, 290, 20, 0, 100) ;de 0 à 100 pour établir un niveau de pourcentage
    SetGadgetState(#Adjustmentbar, 50) ; mise à 50% au départ
    
    TextGadget(#TextSpinUnite, 5, 170, 45, 20, "Unité :") ;les ajustements seront précis de 1 en 1
    SpinGadget(#SpinUnite, 50, 170, 50, 20, 0, 100, #PB_Spin_Numeric) ;de 0 à 100 pour établir un niveau de pourcentage
    SetGadgetState(#SpinUnite, 50)
    
    TextGadget(#TextSpinTen, 120, 170, 45, 20, "Dizaine :") ;les ajustements seront moins précis mais plus rapide de 10 en 10
    SpinGadget(#SpinTen, 170, 170, 50, 20, 0, 100, #PB_Spin_Numeric) ;de 0 à 100 pour établir un niveau de pourcentage
    SetGadgetState(#SpinTen, 50)
    
    TextGadget(#TextSplit, 5, 200, 290, 20, "Splitter position = ",#PB_Text_Border|#PB_Text_Center)   
    SetGadgetText(#TextSplit, "Splitter position = "+Str(GetGadgetState(#Separator))+ " pixels")
    
    TextGadget(#TextLevel, 5, 225, 290, 20, "Level = ",#PB_Text_Border|#PB_Text_Center)   
    SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar))+ " %")
    
    Repeat 
      Event = WaitWindowEvent()
      Select Event
          
        Case #PB_Event_Gadget
          
          Select EventGadget()
              
;             Case #Bouton1 : Debug "Bouton 1 cliqué !"
;               
;             Case #Bouton2 : Debug "Bouton 2 cliqué !"
              
            Case #Separator     : SplitterScrolling(#Separator)
              
            Case #Adjustmentbar : SplitterScrolling(#Adjustmentbar)
              
            Case #SpinUnite     : SplitterScrolling(#SpinUnite)

            Case #SpinTen ;{
              SpinTen = GetGadgetState(#SpinTen)-1      ;on retire 1 du spin auto
              If EventType() = #PB_EventType_Up         ;Le bouton 'Haut' a été pressé.
                SetGadgetState(#SpinTen, SpinTen + 10)  ;on augmente de 10 pour avoir un pas d'une dizaine
              ElseIf EventType() = #PB_EventType_Down   ;Le bouton 'Bas' a été pressé.
                SetGadgetState(#SpinTen, SpinTen - 10)  ;on retire 10
              EndIf 
              SplitterScrolling(#SpinTen) ;application du pourcentage
              ;}
              
          EndSelect
          
        Case #PB_Event_CloseWindow
          Select EventWindow()     
            Case #WIN : Quit = 1                     
          EndSelect
          
      EndSelect
      
    Until Quit = 1
    End 
  EndIf
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Jacobus
Messages : 1641
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: SplitterScrolling(Gadget.i)

Message par Jacobus »

Petite mise à jour du code et ajout de l'option d'utilisation des flèches du clavier pour monter ou descendre le séparateur du SplitterGadget() :)

Code : Tout sélectionner

;;-TOP
;======================================
; SplitterScrolling(Gadget.i)
; Jacobus 23/05/2026 PB 6.40 (x64)
; Windows 11 64bits
;
; Interaction de plusieurs gadgets
; Chacun des 4 gadgets commande les 3 autres
;
; Le programme consiste à commander un SplitterGadget() de plusieurs manières.
; et indirectement à commander TrackBarGadget() et SpinGadget() de plusieurs manières aussi.
;
; 24/05/2026
; Ajout de 2 boutons Up & Down avec icône et raccourcis clavier flèche haut et flèche bas. Unité par unité.
; pour commander la montée et la descente du séparateur + interactions avec les autres gadgets.
; Ajout de 2 boutons Up & Down avec icône et texte pour monter ou descendre complètement le splitter.
;======================================
;-Constantes
Enumeration Fenetres
  #WIN
EndEnumeration

Enumeration Gadgets 
  #Bouton1   
  #Bouton2 
  #Separator
  #Adjustmentbar 
  #TextSplit
  #TextLevel
  #TextSpinUnite
  #SpinUnite
  #TextSpinTen
  #SpinTen
  #Btn_Up
  #Btn_Down
  #Btn_highposition
  #Btn_lowposition
EndEnumeration

Enumeration Menus
  #ShortCut_Menu_Up
  #ShortCut_Menu_Down
EndEnumeration

Procedure SplitterScrolling(Gadget.i)
  ; Dans cette procédure tous les gadgets vont être en interaction
  ; Pour adapter le pourcentage aux autres gadgets
  ; il est nécessaire de diviser la hauteur du SplitterGadegt() par 100
  ; Pour un splitter vertical il faudrait biensûr diviser la largeur par 100
  Height = GadgetHeight(#Separator) 
  Unite.f = (Height-8)/100 ; 1/100 ème de la hauteur du gadget moins les 8 pixels du séparateur       
  UniteF$ = StrF(Unite, 2) ; important de prendre 2 chiffres après la virgule pour un ajustement précis
   
  Select Gadget
      
    Case #Adjustmentbar
      TrackbarLevel = GetGadgetState(#Adjustmentbar)
      SetGadgetState(#Separator, TrackbarLevel * ValF(UniteF$)) ; on multiplie le niveau de la trackbar par l'unité obtenue
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetText(#TextLevel, "Level = "+Str(TrackbarLevel) + " %")
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetState(#SpinUnite, TrackbarLevel)
      SetGadgetState(#SpinTen,   TrackbarLevel)
      
    Case #SpinUnite
      Spinlevel = GetGadgetState(#SpinUnite)
      SetGadgetState(#Separator, Spinlevel * ValF(UniteF$)) ; on multiplie le niveau du spingadget par l'unité obtenue
      SetGadgetState(#SpinTen,   Spinlevel)
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetText(#TextLevel, "Level = "+Str(Spinlevel) + " %")
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetState(#Adjustmentbar, Spinlevel)
      
    Case #SpinTen
      SpinTlevel = GetGadgetState(#SpinTen)
      SetGadgetState(#Separator, SpinTlevel * ValF(UniteF$)) ; on multiplie le niveau du spingadget par l'unité obtenue
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetText(#TextLevel, "Level = "+Str(SpinTlevel) + " %")
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetState(#Adjustmentbar, SpinTlevel)
      SetGadgetState(#SpinUnite,     SpinTlevel)
      
    Case #Separator
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetState(#SpinUnite,     Splitlevel / ValF(UniteF$)) ; par contre ici on est obligé de diviser la valeur du splittergadget par l'unité obtenue
      SetGadgetState(#SpinTen,       Splitlevel / ValF(UniteF$))
      SetGadgetState(#Adjustmentbar, Splitlevel / ValF(UniteF$))
      TrackbarLevel = GetGadgetState(#Adjustmentbar)
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(TrackbarLevel) + " %")
      
    Case #Btn_Up
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetState(#Separator, Splitlevel - ValF(UniteF$)) ; on retire l'unité obtenue pour monter la barre      
      Splitlevel = GetGadgetState(#Separator)                ; vérification de la nouvelle position acceptée par le séparateur
      SetGadgetState(#SpinUnite,     Splitlevel / ValF(UniteF$))   ; ici on est obligé de diviser la valeur du splittergadget par l'unité obtenue
      SetGadgetState(#SpinTen,       Splitlevel / ValF(UniteF$))
      SetGadgetState(#Adjustmentbar, Splitlevel / ValF(UniteF$))
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")
      
    Case #Btn_Down      
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetState(#Separator,  Splitlevel + ValF(UniteF$))    ; on ajoute l'unité obtenue pour descendre la barre 
      Splitlevel = GetGadgetState(#Separator)                    ; vérification de la nouvelle position acceptée par le séparateur                  
      SetGadgetState(#SpinUnite,     Splitlevel / ValF(UniteF$)) ; ici on est obligé de diviser la valeur du splittergadget par l'unité obtenue
      SetGadgetState(#SpinTen,       Splitlevel / ValF(UniteF$))
      SetGadgetState(#Adjustmentbar, Splitlevel / ValF(UniteF$))
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")
      
    Case #Btn_highposition
      SetGadgetState(#Separator,     0)
      SetGadgetState(#SpinUnite,     0)
      SetGadgetState(#SpinTen,       0)
      SetGadgetState(#Adjustmentbar, 0)
      SetGadgetText(#TextSplit, "Splitter position = "+Str(GetGadgetState(#Separator)) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")
      
    Case #Btn_lowposition
      SetGadgetState(#Separator,     100 * ValF(UniteF$))
      SetGadgetState(#SpinUnite,     100) 
      SetGadgetState(#SpinTen,       100)
      SetGadgetState(#Adjustmentbar, 100)
      SetGadgetText(#TextSplit, "Splitter position = "+Str(GetGadgetState(#Separator)) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")
      
  EndSelect  

EndProcedure

;-Fenêtre
If OpenWindow(#WIN, 0, 0, 300, 300, "SplitterScrolling", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
         
    ButtonGadget(#Bouton1, 0, 0, 0, 0, "Bouton 1") ; Inutile de préciser la taille ou les coordonnées
    ButtonGadget(#Bouton2, 0, 0, 0, 0, "Bouton 2") ; car elles seront déterminées automatiquement
    SplitterGadget(#Separator, 5, 5, 290, 130, #Bouton1, #Bouton2, #PB_Splitter_Separator)
    
    TrackBarGadget(#Adjustmentbar, 5, 140, 290, 20, 0, 100) ;de 0 à 100 pour établir un niveau de pourcentage
    SetGadgetState(#Adjustmentbar, 50) ; mise à 50% au départ
    
    TextGadget(#TextSpinUnite, 5, 165, 45, 20, "Unité :") ;les ajustements seront précis de 1 en 1
    SpinGadget(#SpinUnite, 50, 165, 50, 20, 0, 100, #PB_Spin_Numeric) ;de 0 à 100 pour établir un niveau de pourcentage
    SetGadgetState(#SpinUnite, 50)
    
    TextGadget(#TextSpinTen, 5, 190, 45, 20, "Dizaine :") ;les ajustements seront moins précis mais plus rapide de 10 en 10
    SpinGadget(#SpinTen, 50, 190, 50, 20, 0, 100, #PB_Spin_Numeric) ;de 0 à 100 pour établir un niveau de pourcentage
    SetGadgetState(#SpinTen, 50)
    
    ButtonImageGadget(#Btn_Up, 133, 160, 35, 25, ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll",246))
    GadgetToolTip(#Btn_Up,"Monter le séparateur, unité par unité")
    
    ButtonImageGadget(#Btn_Down, 133, 185, 35, 25, ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll",247))
    GadgetToolTip(#Btn_Down,"Descendre le séparateur, unité par unité")
    
    ButtonGadget(#Btn_highposition,200, 160, 90, 25,Space(2)+"En haut") 
    SetWindowLongPtr_(GadgetID(#Btn_highposition), #GWL_STYLE, GetWindowLongPtr_(GadgetID(#Btn_highposition), #GWL_STYLE) |#BS_LEFT)
    SendMessage_(GadgetID(#Btn_highposition), #BM_SETIMAGE, #IMAGE_ICON, ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll", 246))
    GadgetToolTip(#Btn_highposition,"Séparateur tout en haut, affichage bouton 2")
    
    ButtonGadget(#Btn_lowposition,200, 185, 90, 25,Space(2)+"En bas") 
    SetWindowLongPtr_(GadgetID(#Btn_lowposition), #GWL_STYLE, GetWindowLongPtr_(GadgetID(#Btn_lowposition), #GWL_STYLE) |#BS_LEFT)
    SendMessage_(GadgetID(#Btn_lowposition), #BM_SETIMAGE, #IMAGE_ICON, ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll", 247)) 
    GadgetToolTip(#Btn_lowposition,"Séparateur tout en bas, affichage bouton 1")
    
    TextGadget(#TextSplit, 5, 220, 290, 20, "Splitter position = ",#PB_Text_Border|#PB_Text_Center)   
    SetGadgetText(#TextSplit, "Splitter position = "+Str(GetGadgetState(#Separator))+ " pixels")
    
    TextGadget(#TextLevel, 5, 250, 290, 20, "Level = ",#PB_Text_Border|#PB_Text_Center)   
    SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar))+ " %")
        
    AddKeyboardShortcut(#WIN, #PB_Shortcut_Up,   #ShortCut_Menu_Up)
    AddKeyboardShortcut(#WIN, #PB_Shortcut_Down, #ShortCut_Menu_Down)
                                            
   
    Repeat 
      Event = WaitWindowEvent()
      Select Event
          
      ;-Event Menus     
        Case #PB_Event_Menu
          
          Select EventMenu()
              
            Case #ShortCut_Menu_Up   : SplitterScrolling(#Btn_Up)
              
            Case #ShortCut_Menu_Down : SplitterScrolling(#Btn_Down)
              
          EndSelect
          
      ;-Event Gadgets     
        Case #PB_Event_Gadget
            
          Select EventGadget()
              
            Case #Bouton1 : Debug "Bouton 1 cliqué !"
              
            Case #Bouton2 : Debug "Bouton 2 cliqué !"
              
            Case #Separator     : SplitterScrolling(#Separator)
              
            Case #Adjustmentbar : SplitterScrolling(#Adjustmentbar)
              
            Case #SpinUnite     : SplitterScrolling(#SpinUnite)

            Case #SpinTen ;{
              SpinTen = GetGadgetState(#SpinTen)-1      ;on retire 1 du spin auto
              If EventType() = #PB_EventType_Up         ;Le bouton 'Haut' a été pressé.
                SetGadgetState(#SpinTen, SpinTen + 10)  ;on augmente de 10 pour avoir un pas d'une dizaine
              ElseIf EventType() = #PB_EventType_Down   ;Le bouton 'Bas' a été pressé.
                SetGadgetState(#SpinTen, SpinTen - 10)  ;on retire 10
              EndIf 
              SplitterScrolling(#SpinTen) ;application du pourcentage
                                          ;}
              
            Case #Btn_Up   : SplitterScrolling(#Btn_Up)
              
            Case #Btn_Down : SplitterScrolling(#Btn_Down)
              
            Case #Btn_highposition : SplitterScrolling(#Btn_highposition)
              
            Case #Btn_lowposition  : SplitterScrolling(#Btn_lowposition)
              
          EndSelect
     ;-Close window     
        Case #PB_Event_CloseWindow
          Select EventWindow()     
            Case #WIN : Quit = 1                     
          EndSelect
          
      EndSelect
      
    Until Quit = 1
    End 
  EndIf
Dernière modification par Jacobus le dim. 21/juin/2026 14:09, modifié 1 fois.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
venom
Messages : 3222
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: SplitterScrolling(Gadget.i)

Message par venom »

Salut Jacobus.

Merci pour le partage je testerai ça :wink:






@++
Windows 10 x64, PureBasic 6.30 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Kwai chang caine
Messages : 7087
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: SplitterScrolling(Gadget.i)

Message par Kwai chang caine »

Marche bien ici, ça peu etre utile :idea:
Merci pour le partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel
Avatar de l’utilisateur
Bruce33
Messages : 31
Inscription : dim. 10/sept./2023 14:02

Re: SplitterScrolling(Gadget.i)

Message par Bruce33 »

Merci Jacobus pour ce bel exemple de programmation.
J'ai constaté un petit souci : quand j'utilise les touches ou les boutons haut/bas (#Btn_Up et #Btn_Down) et que je change de sens, au premier appui on se déplace encore dans le sens précédent sur les différents gadgets alors que le séparateur fonctionne correctement. Il y a un problème de synchronisation des gadgets.
En corrigeant le programme ainsi (pour utiliser la même valeur de Splitlevel partout) ça va mieux :

Code : Tout sélectionner

    Case #Btn_Up
      Splitlevel = GetGadgetState(#Separator) - ValF(UniteF$) ; on retire l'unité obtenue pour monter la barre
      SetGadgetState(#Separator, Splitlevel)
      SetGadgetState(#SpinUnite, Splitlevel/ValF(UniteF$)) ; par contre ici on est obligé de diviser la valeur du splittergadget par l'unité obtenue
      SetGadgetState(#SpinTen, Splitlevel/ValF(UniteF$))
      SetGadgetState(#Adjustmentbar, Splitlevel/ValF(UniteF$))
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")
      
    Case #Btn_Down
      Splitlevel = GetGadgetState(#Separator) + ValF(UniteF$) ; on ajoute l'unité obtenue pour descendre la barre
      SetGadgetState(#Separator, Splitlevel)
      SetGadgetState(#SpinUnite, Splitlevel/ValF(UniteF$)) ; par contre ici on est obligé de diviser la valeur du splittergadget par l'unité obtenue
      SetGadgetState(#SpinTen, Splitlevel/ValF(UniteF$))
      SetGadgetState(#Adjustmentbar, Splitlevel/ValF(UniteF$))
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")
Avatar de l’utilisateur
Jacobus
Messages : 1641
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: SplitterScrolling(Gadget.i)

Message par Jacobus »

Salut Bruce33, je te remercie.
En corrigeant le programme ainsi (pour utiliser la même valeur de Splitlevel partout) ça va mieux :
Es-tu vraiment sûr de ce que tu avance ? il y a toujours des décalages, sur la trackbar comme sur les spingadget. Il y a aussi une inversion du sens au départ. Je me demande si ce n'est pas dû à la suite des gadgets qui doivent se mettre à jour en même temps...
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Bruce33
Messages : 31
Inscription : dim. 10/sept./2023 14:02

Re: SplitterScrolling(Gadget.i)

Message par Bruce33 »

Je suis sûr du problème avec #Btn_Up et #Btn_Down.
Si je reprends la version originale de #Btn_Up :

Code : Tout sélectionner

   Case #Btn_Up
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetState(#Separator, Splitlevel - ValF(UniteF$)) ; on retire l'unité obtenue pour monter la barre      
      SetGadgetState(#SpinUnite, Splitlevel/ValF(UniteF$)) ; par contre ici on est obligé de diviser la valeur du splittergadget par l'unité obtenue
      SetGadgetState(#SpinTen, Splitlevel/ValF(UniteF$))
      SetGadgetState(#Adjustmentbar, Splitlevel/ValF(UniteF$))
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")
on réalise dans l'ordre :
- la récupération de la position du séparateur dans la variable Splitlevel
- le repositionnement du séparateur à la valeur Splitlevel - ValF(UniteF$)
- la mise à jour des autres gadgets avec la valeur Splitlevel (et une éventuelle mise à l'échelle par le coefficient UniteF$).
Donc on met à jour les gadgets avec la valeur Splitlevel et non Splitlevel - ValF(UniteF$).
Alors les gadgets ont toujours un coup de retard.
Mais ma correction n'est pas parfaite car je me suis rendu compte que le calcul Splitlevel +/- ValF(UniteF$) ne prenait pas en compte le fait qu'on ait atteint la limite de déplacement.
En relisant la position du séparateur on est donc plus fiable :

Code : Tout sélectionner

   Case #Btn_Up
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetState(#Separator, Splitlevel - ValF(UniteF$)) ; on retire l'unité obtenue pour monter la barre      
      Splitlevel = GetGadgetState(#Separator) ; vérification de la nouvelle position acceptée par le séparateur
      SetGadgetState(#SpinUnite, Splitlevel/ValF(UniteF$)) ; par contre ici on est obligé de diviser la valeur du splittergadget par l'unité obtenue
      SetGadgetState(#SpinTen, Splitlevel/ValF(UniteF$))
      SetGadgetState(#Adjustmentbar, Splitlevel/ValF(UniteF$))
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")

Je me suis aussi aperçu qu'au démarrage du programme, le premier déplacement était décalé.
Sur Ubuntu je n'ai pas de problème mais les gadgets ne se comportent pas tout à fait pareil (on ne peut pas "écraser" le texte des boutons, le séparateur a donc moins d'amplitude de mouvement).
Au démarrage on affiche un niveau de 50% avec une position de 62 pixels alors que 50% correspond à 65 pixels.
Je crois que c'est l'épaisseur du séparateur qui crée un décalage. On ne peut pas se déplacer sur 100% de la hauteur du SplitterGadget.
Avatar de l’utilisateur
Jacobus
Messages : 1641
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: SplitterScrolling(Gadget.i)

Message par Jacobus »

Tu as raison en partie, en fait c'est dû au fait que sur les 130 pixels du SplitterGadget(), lorsqu'il est mis au maxi (bouton 1 affiché) soit 100% il y a les 8 pixels du séparateur qui ne sont pas pris. Donc 100% et 122 pixels. C'est ça qui génère des erreurs.
Il faut donc enlever ces 8 pixels de la hauteur pour faire les calculs.

ce qui donne, avec tes corrections :

Code : Tout sélectionner

Procedure SplitterScrolling(Gadget.i)
  ; Dans cette procédure tous les gadgets vont être en interaction
  ; Pour adapter le pourcentage aux autres gadgets
  ; il est nécessaire de diviser la hauteur du SplitterGadegt() par 100
  ; Pour un splitter vertical il faudrait biensûr diviser la largeur par 100
  Height = GadgetHeight(#Separator) 
  Unite.f = (Height-8)/100 ; 1/100 ème de la hauteur du gadget moins les 8 pixels du séparateur       
  UniteF$ = StrF(Unite, 2) ; important de prendre 2 chiffres après la virgule pour un ajustement précis
   
  Select Gadget
      
    Case #Adjustmentbar
      TrackbarLevel = GetGadgetState(#Adjustmentbar)
      SetGadgetState(#Separator, TrackbarLevel * ValF(UniteF$)) ; on multiplie le niveau de la trackbar par l'unité obtenue
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetText(#TextLevel, "Level = "+Str(TrackbarLevel) + " %")
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetState(#SpinUnite, TrackbarLevel)
      SetGadgetState(#SpinTen,   TrackbarLevel)
      
    Case #SpinUnite
      Spinlevel = GetGadgetState(#SpinUnite)
      SetGadgetState(#Separator, Spinlevel * ValF(UniteF$)) ; on multiplie le niveau du spingadget par l'unité obtenue
      SetGadgetState(#SpinTen,   Spinlevel)
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetText(#TextLevel, "Level = "+Str(Spinlevel) + " %")
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetState(#Adjustmentbar, Spinlevel)
      
    Case #SpinTen
      SpinTlevel = GetGadgetState(#SpinTen)
      SetGadgetState(#Separator, SpinTlevel * ValF(UniteF$)) ; on multiplie le niveau du spingadget par l'unité obtenue
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetText(#TextLevel, "Level = "+Str(SpinTlevel) + " %")
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetState(#Adjustmentbar, SpinTlevel)
      SetGadgetState(#SpinUnite,     SpinTlevel)
      
    Case #Separator
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetState(#SpinUnite,     Splitlevel / ValF(UniteF$)) ; par contre ici on est obligé de diviser la valeur du splittergadget par l'unité obtenue
      SetGadgetState(#SpinTen,       Splitlevel / ValF(UniteF$))
      SetGadgetState(#Adjustmentbar, Splitlevel / ValF(UniteF$))
      TrackbarLevel = GetGadgetState(#Adjustmentbar)
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(TrackbarLevel) + " %")
      
    Case #Btn_Up
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetState(#Separator, Splitlevel - ValF(UniteF$)) ; on retire l'unité obtenue pour monter la barre      
      Splitlevel = GetGadgetState(#Separator)                ; vérification de la nouvelle position acceptée par le séparateur
      SetGadgetState(#SpinUnite,     Splitlevel / ValF(UniteF$))   ; ici on est obligé de diviser la valeur du splittergadget par l'unité obtenue
      SetGadgetState(#SpinTen,       Splitlevel / ValF(UniteF$))
      SetGadgetState(#Adjustmentbar, Splitlevel / ValF(UniteF$))
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")
      
    Case #Btn_Down      
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetState(#Separator,  Splitlevel + ValF(UniteF$))    ; on ajoute l'unité obtenue pour descendre la barre 
      Splitlevel = GetGadgetState(#Separator)                    ; vérification de la nouvelle position acceptée par le séparateur                  
      SetGadgetState(#SpinUnite,     Splitlevel / ValF(UniteF$)) ; ici on est obligé de diviser la valeur du splittergadget par l'unité obtenue
      SetGadgetState(#SpinTen,       Splitlevel / ValF(UniteF$))
      SetGadgetState(#Adjustmentbar, Splitlevel / ValF(UniteF$))
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")
      
    Case #Btn_highposition
      SetGadgetState(#Separator,     0)
      SetGadgetState(#SpinUnite,     0)
      SetGadgetState(#SpinTen,       0)
      SetGadgetState(#Adjustmentbar, 0)
      SetGadgetText(#TextSplit, "Splitter position = "+Str(GetGadgetState(#Separator)) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")
      
    Case #Btn_lowposition
      SetGadgetState(#Separator,     100 * ValF(UniteF$))
      SetGadgetState(#SpinUnite,     100) 
      SetGadgetState(#SpinTen,       100)
      SetGadgetState(#Adjustmentbar, 100)
      SetGadgetText(#TextSplit, "Splitter position = "+Str(GetGadgetState(#Separator)) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")
      
  EndSelect  

EndProcedure
Merci pour l'aide au debuggage.
Mise à jour du code dans le second post.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Répondre