Seite 1 von 1

ListIconGadget Navigation / Schnellsuche

Verfasst: 04.08.2021 23:20
von jogo
moin moin zusammen,

wenn ich den Focus auf ein gefülltes ListIconGadget habe und irgendwas eintippe, öffnet sich ja unten ein kleines Stringedit, welches meinen getippten Text aufnimmt.
Wie krieg ich das nun hin, dass mein ListIconGadget während der Eingabe zum passenden Listen-Eintrag hüpft (wenn vorhanden).
Von allein tut es das ListIconGadget unter Linux nicht.

Ich muß sicherlich in der Ereignisschleife dieses Stringedit abfragen und dann im ListIconGadget den entsprechenden Eintrag suchen und hinscrollen.
Aber wie komm ich an dieses Stringedit ran, um es abzufragen?

Danke & Gruß
Jörg

Re: ListIconGadget Navigation / Schnellsuche

Verfasst: 06.08.2021 11:55
von Waldixxl
Hallo jogo
Da dieses kleine Stringedit vom System bereit gestellt wird, musst du es per API abfragen

Hier ein Beispiel aus der PureBasic Linux API Libraries (http://www.chabba.de/LinuxAPI.html)

Code: Alles auswählen

; Module/File:     LV_SearchNative.pb
; Function:        native Search in ListViewGadget - Linux
; Author:          Omi
; Date:            Aug. 16, 2014
; Version:         0.1
; Target Compiler: PureBasic 5.22/5.31/5.40
; Target OS:       Linux: (X/K/L)ubuntu, Mint, 32/64, Ascii/Uni
;--------------------------------------------------------------

EnableExplicit

;Window Variablen
#MainWin= 0
#LIG= 0
#Txt= 1

#WinX= 200
#WinY= 200
#WinW= 500
#WinH= 400

Global.i gEvent, gQuit
Global.s Dim Zeile(20)

DeclareC SearchInTreeView(*model, column, *key, iter, *search_data)


Procedure CreateWindow_Main()
	Protected.i I

	If OpenWindow(#MainWin, #WinX, #WinY, #WinW, #WinH, "native Search in LVG", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
		ListViewGadget(#LIG, 5, 30, 480, 355)
		TextGadget(#Txt, 5, 5, 300, 20, "select row and type the search entry ...")
		
		Restore Surnames
		For I= 0 To 20
			Read.s Zeile(I)
		Next I
		SortArray(Zeile(), #PB_Sort_NoCase)
		
		For I= 0 To 20
			AddGadgetItem(#LIG, -1, Zeile(I))
		Next I
		
		;gtk_tree_view_set_enable_search_(GadgetID(#LIG), #True);                        must be ON
		gtk_tree_view_set_search_column_(GadgetID(#LIG), 0);                            set column for search - must be 0 in LVG
		gtk_tree_view_set_search_equal_func_(GadgetID(#LIG), @SearchInTreeView(), #Null, 0); set function for verification
	EndIf
EndProcedure

Procedure.s UTF8ToSys(UTF8.s);                                                      converts UTF8 to current Std.String-Mode
	Protected *mem= AllocateMemory(StringByteLength(UTF8, #PB_UTF8) + 1)
	Protected *len= PokeS(*mem, UTF8, -1)
	Protected.s SAscii= PeekS(*mem, -1, #PB_UTF8)
	FreeMemory(*mem)
	ProcedureReturn SAscii
EndProcedure

ProcedureC SearchInTreeView(*model, column, *key, iter, *search_data)
	;   every path (line) which partially agrees in systemsearch is sent to this function
	;   om every change of editfield
	
	Protected.i I, Indices, Found= #True
	Protected *path
	Protected.s Search= PeekS(*key);                                                  current search-string in UTF8-Format
	
	Search= UTF8ToSys(Search);                                                        convert search-string to System-String-Mode
	
	*path= gtk_tree_model_get_path_(*model, iter);                                    get path from iter
	Indices= PeekL(gtk_tree_path_get_indices_(*Path));                                get index (LVG-line) from path
	
	If FindString(GetGadgetItemText(#LIG, Indices, column), Search, 1, #PB_String_NoCase); own check to verify the suggestion
		Found= #False
	EndIf
	
	ProcedureReturn Found;                                                            #False = Ok !
EndProcedure


CreateWindow_Main()

Repeat
	gEvent= WaitWindowEvent()
	
	Select gEvent
		Case #PB_Event_CloseWindow
			gQuit= #True
	EndSelect
	
Until gQuit


DataSection
	Surnames:
	Data.s "Bauer", "Müller", "Meier", "Maier", "Huber",
	       "Schmidt", "Schreiner", "Taler", "Bach", "Binder",
	       "Hofer", "Schneider", "Bader", "Berger", "Klein", 
	       "Groß", "Kaiser", "König", "Graf", "Weber", "Urban"
EndDataSection
Walter

Re: ListIconGadget Navigation / Schnellsuche

Verfasst: 07.08.2021 00:24
von jogo
Danke Walter, jetzt hab ich endlich mal einen Ansatz, in welche Richtung die Lösung liegt. Hab gesucht wie ein Guppy - PB-Hilfe, Netz, etc. - hab schon gedacht, ich bin bekloppt.
Bin nicht drauf gekommen, dass dieses Stringedit garnicht direkt von PB erzeugt wird.
Werde dann mal experimentieren & schauen, wie ich klar komm.
Muss WE arbeiten - meld mich dann...

Gruß Jörg

PS:
grad noch schnell getestet: dein Beispiel funktioniert auf Anhieb perfekt. Die Logik hab ich soweit verstanden (hoffe ich) - feine Sache
werde das als nächsten Schritt in mein Projekt einbauen - bin gespannt..

Re: ListIconGadget Navigation / Schnellsuche

Verfasst: 08.08.2021 21:39
von jogo
So! Ist eingebaut & funktioniert einwandfrei.
Danke nochmals für den Tip & Dank an Omi für den Code.

Rein zur Info:
Da ich ja für mein Projekt das ListIconGadget verwende, hab ich bei chabba.de auch den entsprechenden angepassten Code genommen.
Ist im groben das gleiche Prinzip, aber für ListIconGadget spezialisiert.

Code: Alles auswählen

; Module/File:     LIG_SearchNative.pb
; Function:        Native Search in LIG-column - Linux
; Author:          Omi
; Date:            Dec. 09, 2014
; Version:         0.3; path_free, PeekS(*key, -1, #PB_UTF8)
; Target Compiler: PureBasic 5.22/5.31/5.40
; Target OS:       Linux: (X/K/L)ubuntu, Mint, 32/64, Ascii/Uni
;--------------------------------------------------------------

EnableExplicit

; Object constants
#MainWin= 0
#LIG= 0
#Txt= 1

#WinX= 200
#WinY= 200
#WinW= 500
#WinH= 400

Global.i gEvent, gQuit
Global.s Dim Zeile(20)

ProcedureC Callback_SearchInTreeView(*model, column, *key, iter, *search_data)
	;   every path (line) which partially agrees in systemsearch is sent to this function
	;   on every change of editfield
	Protected.i I, Found= #True
	Protected.l Indices
	Protected path
	Protected.s Search= PeekS(*key, -1, #PB_UTF8);                                     current search-string in UTF8-Format
	
	path   = gtk_tree_model_get_path_(*model, iter);                                   get path from iter,
	Indices= PeekL(gtk_tree_path_get_indices_(path));                                  then index (LIG-line) from path
	
	If FindString(GetGadgetItemText(#LIG, Indices, column), Search, 1, #PB_String_NoCase); own check to verify the suggestion
		Found= #False
	EndIf
	gtk_tree_path_free_(path);                                                        forgot it till V0.2
	ProcedureReturn Found;                                                            #False = Ok !
EndProcedure

Procedure CreateWindow_Main()
	Protected.i I, O

	If OpenWindow(#MainWin, #WinX, #WinY, #WinW, #WinH, "native Search in LIG", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
		ListIconGadget(#LIG, 5, 30, 480, 355, "column 1", 100, #PB_ListIcon_AlwaysShowSelection | #PB_ListIcon_GridLines)
		TextGadget(#Txt, 5, 5, 300, 20, "select row and type the search item ...")
		For O= 1 To 2
			AddGadgetColumn(#LIG, O, "column "+Str(O+ 1), 100)
		Next O
		
		Restore Surnames
		For I= 0 To 20
			Read.s Zeile(I)
		Next I
		SortArray(Zeile(), #PB_Sort_NoCase)
		
		For I= 0 To 20
			AddGadgetItem(#LIG, -1, Zeile(I))
		Next I
		
		;gtk_tree_view_set_enable_search_(GadgetID(#LIG), #True);                        must be ON
		gtk_tree_view_set_search_column_(GadgetID(#LIG), 0);                            set column 0 for search
		gtk_tree_view_set_search_equal_func_(GadgetID(#LIG), @Callback_SearchInTreeView(), #Null, 0); set function for verification
	EndIf
EndProcedure

CreateWindow_Main()

Repeat
	gEvent= WaitWindowEvent()
	
	Select gEvent
		Case #PB_Event_CloseWindow
			gQuit= #True
	EndSelect
	
Until gQuit
End

DataSection
	Surnames:
	Data.s "Bauer", "Müller", "Meier", "Maier", "Huber",
	       "Schmidt", "Schreiner", "Taler", "Bach", "Binder",
	       "Hofer", "Schneider", "Bader", "Berger", "Klein", 
	       "Groß", "Kaiser", "König", "Graf", "Weber", "Zauner"
EndDataSection