Page 1 sur 1

AutoComplete StringGadget [Cross-Platform]

Publié : ven. 16/oct./2009 9:24
par Thyphoon
hier j'étais bloqué dans les transports ... (Merci la SNCF/RATP)
et voici ce que j'ai pondu ! C'est pas tout a fait finit, il y a encore quelques bugs et amélioration a apporté !

l'idée c'est de déclarer le numero des gadgets et la fonction qui rafraichira les propositions d'autocomplete
on peu utilisé les fleches haut bas pour choisir et Entrer pour validé !
J'ai pas commenté le code, faudra que je le fasse.

Si certain on des propositions pour améliorer ça qu'il n'hesite pas !
je serais currieux parcontre de savoir si ça marche sur Linux ou MacOS

Edit : petite correction de code pour que TAB fonctionne
Edit : bug sur la recherche de mot corrigé !

Code : Tout sélectionner

#Gdt_AutoComplete=999 ; The AutoComplete GadgetID


Structure AutoComplete 
  FocusGadgetID.i  ; The current Gadget
EndStructure
Global AutoComplete.AutoComplete


Structure AutoCompleteGadgetList
  GadgetID.i      ; Gadget who Enable Autocomplete
  *Function       ; Pointer to Refresh Autocmplete Gadget function [No Impemented] ;See RefreshAutoComplete()
EndStructure
Global NewList AutoCompleteGadgetList.AutoCompleteGadgetList()

; Function ton Refresh AutoComplete Gadget
Procedure RefreshAutoComplete()
  If IsGadget(#Gdt_AutoComplete)
  Selecttxt.s=GetGadgetText(AutoComplete\FocusGadgetID)
  ClearGadgetItems(#Gdt_AutoComplete)
  Dim Selection.s(10)
  Selection(0)="Cinéma"
  Selection(1)="histoire"
  Selection(2)="Purebasic"
  Selection(3)="Amiga"
  Selection(4)="Aliens"
  Debug Selecttxt
  For z=0 To 9
    Debug LCase(Selection(z))+"=?"+LCase(Selecttxt)
    If FindString(LCase(Selection(z)),LCase(Selecttxt),-1)
      AddGadgetItem(#Gdt_AutoComplete, -1,Selection(z))
    EndIf
  Next
  SetGadgetState(#Gdt_AutoComplete,0)
EndIf
EndProcedure

Procedure InitAutoComplete(Window.i)
  AddKeyboardShortcut(0, #PB_Shortcut_Down, 63999)
  AddKeyboardShortcut(0, #PB_Shortcut_Up, 63998)
  AddKeyboardShortcut(0, #PB_Shortcut_Return, 63997)
  AddKeyboardShortcut(0, #PB_Shortcut_Tab, 63996)
EndProcedure

;Create the AutoComplete Gadget
Procedure AutoCompleteStart(Gadget)
  AutoComplete\FocusGadgetID=Gadget
  ListViewGadget(#Gdt_AutoComplete, GadgetX(Gadget), GadgetY(Gadget)+GadgetHeight(Gadget), GadgetWidth(Gadget),100)
  RefreshAutoComplete()
EndProcedure
  
  ;Destroy the AutoComplete Gadget
Procedure AutocompleteEnd()
    FreeGadget(#Gdt_AutoComplete)
    AutoComplete\FocusGadgetID=-1
EndProcedure

;Test if this gadget have autocomplete active
Procedure IsAutoCompleteGadget(GadgetID.l)
  ForEach AutoCompleteGadgetList()
    If AutoCompleteGadgetList()\GadgetID=GadgetID
      ProcedureReturn #True
    EndIf
  Next
  ProcedureReturn #False
EndProcedure


;Active autocomplete on Gadget, 
Procedure AddAutoCompleteToGadget(GadgetID.l,*Function)
  AddElement(AutoCompleteGadgetList())
  AutoCompleteGadgetList()\GadgetID=GadgetID
  AutoCompleteGadgetList()\Function=*Function
EndProcedure

Macro AutoCompeteEvent(EventID)
  If IsAutoCompleteGadget(GetActiveGadget())
    
    Select EventType()
      Case #PB_EventType_Focus 
        If GetActiveGadget()<>AutoComplete\FocusGadgetID
          AutoCompleteStart(EventGadget())
        EndIf
      
      Case #PB_EventType_LostFocus
        If GetActiveGadget()<>#Gdt_AutoComplete
          AutocompleteEnd()
        EndIf
      Case #PB_EventType_Change
        If IsGadget(#Gdt_AutoComplete)=#False
          AutoCompleteStart(GetActiveGadget())
        EndIf
        RefreshAutoComplete()
    EndSelect
              
    If EventType()= #PB_EventType_Change
      RefreshAutoComplete()
    EndIf
  EndIf
    
  If (GetActiveGadget()=#Gdt_AutoComplete Or IsAutoCompleteGadget(GetActiveGadget()) )And EventID = #PB_Event_Menu
    Select EventMenu() 
      Case 63999 ; Down Key 
        SetGadgetState(#Gdt_AutoComplete,GetGadgetState(#Gdt_AutoComplete)+1)
      Case 63998 ; Up Key
        SetGadgetState(#Gdt_AutoComplete,GetGadgetState(#Gdt_AutoComplete)-1)
      Case 63997 ; Enter Key
        SetGadgetText(AutoComplete\FocusGadgetID,GetGadgetText(#Gdt_AutoComplete))
        AutocompleteEnd()
      Case 63996 ; Tab Key
        SetGadgetText(AutoComplete\FocusGadgetID,GetGadgetText(#Gdt_AutoComplete))
        AutocompleteEnd()
        NextGadget=GetActiveGadget()+1
        If IsGadget(NextGadget)
          SetActiveGadget(NextGadget)
        EndIf
        
    EndSelect
  EndIf
        
  If EventID = #PB_Event_Gadget And EventGadget()=#Gdt_AutoComplete
    SetGadgetText(AutoComplete\FocusGadgetID,GetGadgetText(#Gdt_AutoComplete))
  EndIf
EndMacro


;#######
#WindowWidth  = 390
#WindowHeight = 350

If OpenWindow(0, 100, 200, #WindowWidth, #WindowHeight, "PureBasic - Gadget Demonstration", #PB_Window_MinimizeGadget)
    
  Top = 10
  GadgetHeight = 24

  Frame3DGadget(#PB_Any, 10, Top, 370, 290, "Player...") : Top+20

  StringGadget(1,  20, 10, 200, GadgetHeight, "")
  StringGadget(2,  20, 40, 200, GadgetHeight, "")
  StringGadget(3,  20, 70, 200, GadgetHeight, "")
  ButtonGadget(8, #WindowWidth-100, #WindowHeight-36, 80, 24, "Quit")



InitAutoComplete(0) ;initalise autocomplete on Window 0
AddAutoCompleteToGadget(1,@RefreshAutoComplete()) ; active Autocomplet on gadget 1
AddAutoCompleteToGadget(3,@RefreshAutoComplete()) ; Active Autocomplet on gadget 2
  Repeat
    EventID = WaitWindowEvent()
    
    AutoCompeteEvent(EventID)
    ;#####################
 
       
    If EventID = #PB_Event_Gadget

      Select EventGadget()
        Case 0

        Case 2 
          
        Case 3

        Case 8 ; Quit...
          EventID = #PB_Event_CloseWindow

     EndSelect

    EndIf

  Until EventID = #PB_Event_CloseWindow

EndIf

End   

Re: AutoComplete StringGadget [Cross-Platform]

Publié : ven. 16/oct./2009 9:33
par Cls
Salut !

Sur la 4.40 b5, ça me renvoie toujours "cinéma". L'affichage plante également sur le second StringGadget.

En tout cas très bonne idée, c'est prometteur ! ;)

Re: AutoComplete StringGadget [Cross-Platform]

Publié : ven. 16/oct./2009 9:42
par Thyphoon
j'ai corrigé le code ! dit moi si ça marche mieux :P
il y a encore un bug qui fait planté de temps en temps ! (c'est du a a la touche tab pour passer au gadget suivant si GadgetID+1 n'existe pas ...)

Pour la selection des propositions les Fleches puis Return ou les Fleches puis tab ...

Re: AutoComplete StringGadget [Cross-Platform]

Publié : ven. 16/oct./2009 10:29
par Cls
Oui ça marche mieux. Dès qu'une lettre est trouvée, il affiche les mots contenant cette lettre.

Chez moi, c'est nickel :D

Re: AutoComplete StringGadget [Cross-Platform]

Publié : ven. 16/oct./2009 11:44
par Thyphoon
Super ! il y a surement des améliorations a faire ... si il y a des suggestions n'hésitez pas ...