Keyboard Shortcuts - Suche in einem Tree Gadget

Für allgemeine Fragen zur Programmierung mit PureBasic.
TWELVE
Beiträge: 72
Registriert: 01.04.2007 18:33

Keyboard Shortcuts - Suche in einem Tree Gadget

Beitrag von TWELVE »

Gegeben sei ein TreeGadget, gefüllt mit Items, sowie ein StringGadget für einen zu suchenden Text und Keyboard Shortcuts, die an das Window
angefügt wurden.Sowie noch zwei Buttons, um hoch oder runter zu suchen.

Ich möchte den Text in dem StringGadget im Text aller Items des TreeGadgets suchen.Das gefundene Item wird mittels SetGadgetState(Tree_0,Item)
ausgewählt.Damit das Item auch als ausgewählt angezeigt wird ( blau hinterlegt), muß ich SetActiveGadget(Tree_0) verwenden.

Über die Buttons funktioniert das erstmal wie gewünscht.Zur Vereinfachung möchte ich die Suche auch über die Keyboard Shortcuts steuern,
aber da ich zwei solche StringGadgets als Suchboxen habe, muß ich irgendwie das jeweils aktive StringGadget ermitteln.Bisher mache ich
das über GetActiveGadget(), aber da ich das TreeGadget active setzen muß, damit es das selektierte Item blau unterlegt anzeigt, funktioniert
das so nicht mehr, da ja dann das TreeGadget das aktive Gadget ist und keines der StringGadgets, wo ich dann z.B. Enter drücke.

Wenn ich das TreeGadget mit dem Flag #PB_Tree_AlwaysShowSelection erstelle, funktioniert es fast gewünscht, allerdings wird dann das
selektierte Item nur grau statt blau hinterlegt markiert.Außerdem kann ich dieses Flag über den integrierten FormDesigner auch nicht setzen.

Obwohl es nicht dokumentiert ist, habe ich rausgefunden, dass

SetGadgetAttribute(Tree_0, #PB_Tree_AlwaysShowSelection, 1 )

trotzdem funktioniert, womit ich zumindest das FormDesigner Problem umgehen kann.

Wer hat noch eine Idee, wie man das aktive StringGadget für die KeyBoardShortcuts ermitteln kann und trotzdem
das selektierte Item im TreeGadget blau hinterlegen kann ( also dann vermutlich ohne die Verwendung von
SetActiveGadget(Tree_0) ...).

Der Code funktioniert wie erwartet, das ist also kein Fehler, mehr eine Frage des Designs ( und das man
Keyboard Shortcuts eben nur an ein Window und nicht an ein Gadget binden kann - zumindest ist das
mein Stand).

Ich habe schon überlegt, mir evtl. das StringGadget zu merken, wo zuletzt ein Text eingetippt wurde
und dann die Annahme tätige, dieses ist das Suchfeld, wo die Shortcust angewendet werden sollen
( also z.B. Enter für nächstes / weitersuchen in meinem Fall).


Aber vielleicht gibts ja noch bessere Lösungen, evtl. über WinAPI ?



Vielen Dank im voraus schonmal...

TWELVE
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Keyboard Shortcuts - Suche in einem Tree Gadget

Beitrag von ts-soft »

Shortcut bei #PB_EventType_Focus Event() setzen und bei #PB_EventType_LostFocus wieder löschen!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
TWELVE
Beiträge: 72
Registriert: 01.04.2007 18:33

Re: Keyboard Shortcuts - Suche in einem Tree Gadget

Beitrag von TWELVE »

ts-soft hat geschrieben:Shortcut bei #PB_EventType_Focus Event() setzen und bei #PB_EventType_LostFocus wieder löschen!
Was soll das genau bringen ? Die Shortcuts füge ich zum Window hinzu, die gelten also fürs Window und nicht
für ein bestimmtes Gadget, warum sollte man die je nach Focus hinzufügen und wieder entfernen ?

Es geht ja letzlich nur darum, bei der Verarbeitung der KB Shortcuts das aktive StringGadget zu ermitteln.
GetActiveGadget() funktioniert wie oben beschrieben nicht mehr, weil ich das TreeGadget active setzen muß,
damit der selektierte Eintrag blau unterlegt wird.

Außerdem wird das Tree bei jedem Suchlauf active gesetzt, das StringGadget darf also keinen Focus erhalten,
weil sonst der Tree wieder den Fokus verliert ( dann wechselt die blaue Hinterlegung in die graue, die ich nicht will).

Ich überlege gerade, ob ich nicht beim Reinklicken in ein StringGadget dieses als "active" irgendwo abspeichere und
damit dann die KB Shortcuts steuere.

Um es nochmal klarzumachen: die Auswertung der KB Shortcut Events ist das Problem, nicht die KB Shortcuts selber.

Cleverer wärs aber eigentlich, wenn man irgendwie das TreeGadget dazu bringen könnte, das selektierte Item blau
zu hinterlegen obwohl das Tree nicht das aktive Gadget ist.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Keyboard Shortcuts - Suche in einem Tree Gadget

Beitrag von NicTheQuick »

Wie wäre es mit '#PB_Tree_AlwaysShowSelection'? Steht alles in der Hilfe.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Keyboard Shortcuts - Suche in einem Tree Gadget

Beitrag von ts-soft »

TWELVE hat geschrieben:Was soll das genau bringen ? Die Shortcuts füge ich zum Window hinzu, die gelten also fürs Window und nicht für ein bestimmtes Gadget, warum sollte man die je nach Focus hinzufügen und wieder entfernen ?
Ich dachte, Du willst den Shortcuts dem Gadget hinzufügen und nicht dem Window. Dafür mein Code-Beispiel. Jetzt blicke ich aber garnicht mehr durch und halte mich wieder raus.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
TWELVE
Beiträge: 72
Registriert: 01.04.2007 18:33

Re: Keyboard Shortcuts - Suche in einem Tree Gadget

Beitrag von TWELVE »

NicTheQuick hat geschrieben:Wie wäre es mit '#PB_Tree_AlwaysShowSelection'? Steht alles in der Hilfe.
TWELVE hat geschrieben:Wenn ich das TreeGadget mit dem Flag #PB_Tree_AlwaysShowSelection erstelle, funktioniert es fast gewünscht, allerdings wird dann das
selektierte Item nur grau statt blau hinterlegt markiert.
:praise:

:-)

Dann ist es grau, ich wollte es aber blau, so als wenn man es anklickt.
TWELVE
Beiträge: 72
Registriert: 01.04.2007 18:33

Re: Keyboard Shortcuts - Suche in einem Tree Gadget

Beitrag von TWELVE »

Ich habe jetzt eine funktionierende Lösung gebastelt, basierend auf der Idee, mir das zuletzt aktivierte StringGadget als Data ( 1 für "active", 0 für "inactive")
im StringGadget zu merken.Funktioniert wie gewünscht.Die Shortcuts gelten also immer für das StringGadget, in das zuletzt reingeklickt wurde.Das hat auch
den Vorteil, dass nerviges wieder-Reinklicken in das String entfällt, wenn ein anderes Gadget mal den Fokus gekriegt hat.

Code: Alles auswählen

        
...
AddKeyboardShortcut(Window,#PB_Shortcut_Return, 100)
...
Select event
   
    Case #PB_Event_Menu
         Select EventMenu()
           Case 100 ; Enter
            
                
        If GetGadgetData(String_0)
        
        search text in String_0    
        
        EndIf   
          
         If GetGadgetData(String_1)
          
         search text in String_1 
            
          EndIf  
      
       EndSelect

      Case #PB_Event_Gadget
       

          Select EventGadget()

            Case String_0
         
               Select EventType()
              
                   Case #PB_EventType_Focus
                      SetGadgetData(String_0, 1) ; set String_0 "active"
                      SetGadgetData(String_1, 0) ; set String_1 "inactive"
              
                    Case #PB_EventType_LostFocus
              
                         
                 EndSelect        
          
          
          
                Case String_1
          
                    Select EventType()
              
                       Case #PB_EventType_Focus
                       SetGadgetData(String_1, 1) ; set String_1 "active"
                       SetGadgetData(String_0, 0) ; set String_0 "inactive"
                           
                       Case #PB_EventType_LostFocus
                                       
                   EndSelect

            EndSelect

    EndSelect

Bin aber trotzdem noch an anderen / besseren Lösungen interessiert !

ts-soft: kannst Du Deinen Vorschlag nochmal etwas näher beschreiben ?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Keyboard Shortcuts - Suche in einem Tree Gadget

Beitrag von ts-soft »

Code: Alles auswählen

OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "bla", #PB_Tree_AlwaysShowSelection)
TreeGadget(0, 5, 5, 630, 400)
StringGadget(1, 5, 410, 630, 30, "Hallo")
StringGadget(2, 5, 445, 630, 30, "Holla")
AddGadgetItem(0, -1, "Item 0", 0, 0)
AddGadgetItem(0, -1, "Sub-Item 1", 0, 1)
AddGadgetItem(0, -1, "Sub-Item 2", 0, 1)
AddGadgetItem(0, -1, "Sub-Item 3", 0, 1)
AddGadgetItem(0, -1, "Sub-Item 4", 0, 1)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow : Break
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 1
          Select EventType()
            Case #PB_EventType_Focus
              AddKeyboardShortcut(0, #PB_Shortcut_Return, 100)
            Case #PB_EventType_LostFocus
              RemoveKeyboardShortcut(0, #PB_Shortcut_Return)
          EndSelect
      EndSelect
    
    Case #PB_Event_Menu
      Select EventMenu()
        Case 100
          Debug "Aber Hallo, StringGadget 1 hat den Focus"
      EndSelect
  EndSelect
ForEver
Kein GetActiveGadget und kein Shortcut fürs Fenster.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
TWELVE
Beiträge: 72
Registriert: 01.04.2007 18:33

Re: Keyboard Shortcuts - Suche in einem Tree Gadget

Beitrag von TWELVE »

@ts-soft

Danke für Deinen Code !

Was passiert in Deinem Eventhandling, wenn das andere String Gadget den Focus hat ?

Code: Alles auswählen

Case #PB_Event_Menu
      Select EventMenu()
        Case 100
          Debug "Aber Hallo, StringGadget 1 hat den Focus"
      EndSelect
  EndSelect
Du wertest ja nur die ID 100 des KB Shortcuts aus, auch wenn Du den Shortcut hinzugefügt hast, als StringGadget 1 den Focus hatte, er gilt für das
Window und damit für jedes Gadget.

Ob Du den KB Shortcut dynamisch hinzufügst und entfernst, je nachdem, welches Gadget den Focus hat, spielt keine Rolle, da
er eben für das ganze Window gilt und nicht für ein einzelnes Gadget.

Daher muß der Trick im Eventhandler stattfinden....

Abgesehen davon hat mind. eines meiner StringGadgets nach einer Suche des Textes nie den Fokus, weil ich den Fokus
dem TreeGadget geben muß, damit es das gefundene und selektierte Item blau unterlegen kann.

Daher würde Dein Code selbst dann nicht funktionieren, wenn er ansonsten richtig wäre.

Am simpelsten wäre #PB_Tree_AlwaysShowSelection, wenn es die selektierten Items dann nicht grau statt blau unterlegen würde.
Mir gefällt grau aus dem Grunde nicht, weil es sich von einem Left-Click auf das Item optisch unterscheidet und außerdem
grau zu unauffällig ist.

Wenn sonst niemand einen tollen WinAPI Trick dafür hat, bleibe ich bei meinem Code oben, da er genauso funktioniert, wie ich
ich es haben will ( ich mag es nur nicht, für relativ simple Funktionen relativ viel Code ein/umzubauen, wenn es dafür auch
einen simpleren Weg gibt).
Antworten