ListIconGadget Navigation / Schnellsuche

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
jogo
Beiträge: 64
Registriert: 22.11.2020 20:05
Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint Mate

ListIconGadget Navigation / Schnellsuche

Beitrag 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
--
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02
Benutzeravatar
Waldixxl
Beiträge: 108
Registriert: 27.12.2005 17:35
Wohnort: Linz, Österreich

Re: ListIconGadget Navigation / Schnellsuche

Beitrag 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
Lesen bei schlechten Lichtverhältnissen ist nicht schlecht für die Augen, sondern trainiert sie sogar.

Linux Ubuntu Mate 18.04
PB 5.71
Intel i5
jogo
Beiträge: 64
Registriert: 22.11.2020 20:05
Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint Mate

Re: ListIconGadget Navigation / Schnellsuche

Beitrag 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..
--
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02
jogo
Beiträge: 64
Registriert: 22.11.2020 20:05
Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint Mate

Re: ListIconGadget Navigation / Schnellsuche

Beitrag 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
--
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02
Antworten