Seite 1 von 1

TreeGadget Falt-Button erzwingen

Verfasst: 24.07.2012 15:30
von Lambda
Ein Parent-Item weiß dass es Sub-Items besitzt, allerdings werden die erst durch entfalten geladen/hinzugefügt. Kann ich also ein "+"-Symbol zum entfalten auf diesem Item darstellen obwohl es noch eine existierenden Einträge hat?

API natürlich erlaubt. :D

Durch folgenden Lösung ändere ich auch das Icon für gefaltet/entfaltet

Code: Alles auswählen

 For c=0 To CountGadgetItems(#Tree)-1
            debug c
            *entry=GetGadgetItemData(#Tree, c)
            If *entry\type = #ENTRY_CATEGORY
              If GetGadgetItemState(#Tree, c) & #PB_Tree_Expanded
                lvi.TV_ITEM
                lvi\mask = #TVIF_IMAGE | #TVIF_HANDLE |#TVIF_SELECTEDIMAGE
                lvi\hItem = GadgetItemID(#Tree, c)
                lvi\iImage = 2
                lvi\iSelectedImage = 2
                SendMessage_(GadgetID(#Tree),#TVM_SETITEM,0,lvi)
              Else
                lvi.TV_ITEM
                lvi\mask = #TVIF_IMAGE | #TVIF_HANDLE |#TVIF_SELECTEDIMAGE
                lvi\hItem = GadgetItemID(#Tree, c)
                lvi\iImage = 1
                lvi\iSelectedImage = 1
                SendMessage_(GadgetID(#Tree),#TVM_SETITEM,0,lvi)
              EndIf
            EndIf
          Next

Re: TreeGadget Falt-Button erzwingen

Verfasst: 25.07.2012 17:33
von Lambda
Weiß denn niemand (weder hier noch engl.) ob, und wenn ja, wie das möglich wäre?

Re: TreeGadget Falt-Button erzwingen

Verfasst: 25.07.2012 18:46
von bobobo
ein pseudo sublevel erstellen und den beim Befüllen erstmal löschen wäre doch wohl ne Möglichkeit

Das Problem besteht wohl darin, dass das Klicken des Level-Kreuzchens kein anständiges Event auslöst
Vielleicht findest du ja was in der wparam lparam orgie beim Kreuzchenklicken

Hier Autoauffüllen bei Auswahl eines Leveltextes (Node 1 und so)

Code: Alles auswählen

;pb-Demo-code angepasst
Procedure mwcb(WindowID, Message, wParam, lParam)
  Debug Message
  Debug "wParam "+Str(wParam)
  Debug "lparam "+Str(lParam)
  Debug "***********"
  Result = #PB_ProcessPureBasicEvents
  ;
  ; Ihr Programmcode hier
  ;
  ProcedureReturn Result
EndProcedure

If OpenWindow(0, 0, 0, 355, 180, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  SetWindowCallback(@mwcb(),0)
  
  TreeGadget(0, 10, 10, 160, 160,#PB_Tree_Expanded)                                         ; TreeGadget Standard
  TreeGadget(1, 180, 10, 160, 160, #PB_Tree_CheckBoxes|#PB_Tree_NoLines)  ; TreeGadget mit Checkboxen + ohne Linien
  For ID = 0 To 1
    For a = 0 To 10
      AddGadgetItem (ID, -1, "Normal Item "+Str(a), 0, 0) ; wenn Sie ein Bild hinzufügen möchten, dann 
      AddGadgetItem (ID, -1, "Node "+Str(a), 0, 0)        ; benutzen Sie ImageID(x) als 4. Parameter
      AddGadgetItem(ID, -1, "pseudo", 0, 1)     ; diese sind auf dem ersten Sublevel
    Next
  Next
  Repeat 
    event=WaitWindowEvent()
    gadget=EventGadget()
    Select event
      Case #PB_Event_CloseWindow
        quit+1
      Case #PB_Event_Gadget
        If gadget=0
          If GetGadgetItemAttribute(0,GetGadgetState(0)+1,#PB_Tree_SubLevel)=1 And GetGadgetItemText(0,GetGadgetState(0)+1)="pseudo"
            RemoveGadgetItem(0,GetGadgetState(0)+1)
            AddGadgetItem(0,GetGadgetState(0)+1,"Eintrag 1",0,1)
            AddGadgetItem(0,GetGadgetState(0)+2,"Eintrag 2",0,1)
            AddGadgetItem(0,GetGadgetState(0)+3,"Eintrag 3",0,1)
            AddGadgetItem(0,GetGadgetState(0)+4,"Eintrag 4",0,1)
            SetGadgetItemState(0,GetGadgetState(0),#PB_Tree_Expanded)
          EndIf
        EndIf
    EndSelect
  Until quit
EndIf

Re: TreeGadget Falt-Button erzwingen

Verfasst: 25.07.2012 19:43
von Lambda
Genau solch eine provisorische Dummy-Lösung (nicht dummie :D ) will ich umgehn.

Die Sache dient rein der Optik. Wird ein Eintrag angewählt werden dessen Kinder erst geladen.

"Window" besitzt auch Einträge, welche aber erst durch Anwahl geladen werden. Aber ich denk mal das Problem ist verständlich. Wie gesagt die es mehr der Optik, da es für viele dann leer wirkt.



Edit: Sieht man auch bei FTP Programmen, bei denen Ordner erst nach Anwahl entfaltbar sind. Nicht das ich FTP nutze :D aber es ist eine Auflistung über Netzwerk, die nur an gebrauchten stellen stattfinden darf.

Re: TreeGadget Falt-Button erzwingen

Verfasst: 26.07.2012 13:54
von bobobo
hmm ..
und so ? (linkes treegadget)

Code: Alles auswählen

;pb-Demo-code angepasst
k=24
kroiz=CreateImage(#PB_Any,k,k)
StartDrawing(ImageOutput(kroiz))
  Box(0,0,k,k,RGB(255,222,192))
  LineXY(0,0,k,k,black)
  LineXY(0,k-1,k-1,0,black)
StopDrawing()
If OpenWindow(0, 0, 0, 355, 180, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TreeGadget(0, 10, 10, 160, 160,#PB_Tree_NoButtons)                                         ; TreeGadget Standard
  TreeGadget(1, 180, 10, 160, 160, #PB_Tree_CheckBoxes|#PB_Tree_NoLines)  ; TreeGadget mit Checkboxen + ohne Linien
  For ID = 0 To 1
    For a = 0 To 10
      AddGadgetItem (ID, -1, "Normal Item "+Str(a), 0, 0) ; wenn Sie ein Bild hinzufügen möchten, dann 
      AddGadgetItem (ID, -1, "Node"+Chr(160)+Str(a), ImageID(kroiz), 0)        ; benutzen Sie ImageID(x) als 4. Parameter
;      AddGadgetItem(ID, -1, "pseudo", 0, 1)     ; diese sind auf dem ersten Sublevel
    Next
  Next
  Repeat 
    event=WaitWindowEvent()
    gadget=EventGadget()
    Select event
      Case #PB_Event_CloseWindow
        quit+1
      Case #PB_Event_Gadget
        If gadget=0
          ;If get
          pos=GetGadgetState(0)
          If FindString(GetGadgetItemText(0,pos),Chr(160),0)
            SetGadgetItemText(0,pos,ReplaceString(GetGadgetItemText(0,pos),Chr(160)," "))
            ;SetGadgetItemText(0,
          ;If GetGadgetItemAttribute(0,GetGadgetState(0)+1,#PB_Tree_SubLevel)=1 And GetGadgetItemText(0,GetGadgetState(0)+1)="pseudo"
          ;  RemoveGadgetItem(0,GetGadgetState(0)+1)
            AddGadgetItem(0,GetGadgetState(0)+1,"Eintrag 1",0,1)
            AddGadgetItem(0,GetGadgetState(0)+2,"Eintrag 2",0,1)
            AddGadgetItem(0,GetGadgetState(0)+3,"Eintrag 3",0,1)
            AddGadgetItem(0,GetGadgetState(0)+4,"Eintrag 4",0,1)
            SetGadgetItemState(0,GetGadgetState(0),#PB_Tree_Expanded)
          EndIf
        EndIf
    EndSelect
  Until quit
EndIf

Re: TreeGadget Falt-Button erzwingen

Verfasst: 26.07.2012 15:25
von Lambda
Höh? ^^

In dem Beispiel sind doch keine Childs? Belasse es jetzt erstmal ohne Falte, durch anklicken entfaltet er sich nach dem Laden selbst, und das Icon ist grau wenn es ein leeres Verzeichnis ist (ich denke darauf wolltest du raus oder? ^^). Aber trotzdem danke für deine Mühe.

Re: TreeGadget Falt-Button erzwingen

Verfasst: 26.07.2012 16:22
von bobobo
ich wollte drauf hinaus dass man das Standardkreuzchen auch weglassen und durch ein eigenes ersetzen kann
(das ist dann zwar funktional etwas anders aber immerhin)
ich hab nochmal nachgetunt

Code: Alles auswählen

;pb-Demo-code angepasst
k=40
kroiz=CreateImage(#PB_Any,k,k)
StartDrawing(ImageOutput(kroiz))
  Box(0,0,k,k,#White)
  Box(k/4,k/4,k/2,k/2,#Black)
  Box(k/4+2,k/4+2,k/2-4,k/2-4,RGB(200,200,200))
  ;Box(1,1,k-2,k-2,RGB(200,200,200))
  
  LineXY(k/4,k/4,k/4+k/2,k/4+k/2,black)
  LineXY(k/4,k/4+k/2,k/4+k/2,k/4,black)
  ;LineXY(k/4+1,k/2+1,k/2+1,k/4+1,black)
StopDrawing()
If OpenWindow(0, 0, 0, 355, 180, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TreeGadget(0, 10, 10, 160, 160,#PB_Tree_NoButtons)                                         ; TreeGadget Standard
  ;TreeGadget(1, 180, 10, 160, 160, #PB_Tree_CheckBoxes|#PB_Tree_NoLines)  ; TreeGadget mit Checkboxen + ohne Linien
  ;For ID = 0 To 1
    For a = 0 To 10
      AddGadgetItem (ID, -1, "Normal Item "+Str(a), 0, 0) ; wenn Sie ein Bild hinzufügen möchten, dann 
      AddGadgetItem (ID, -1, "Node"+Chr(160)+Str(a), ImageID(kroiz), 0)        ; benutzen Sie ImageID(x) als 4. Parameter
;      AddGadgetItem(ID, -1, "pseudo", 0, 1)     ; diese sind auf dem ersten Sublevel
    Next
  ;Next
  Repeat 
    event=WaitWindowEvent()
    gadget=EventGadget()
    Select event
      Case #PB_Event_CloseWindow
        quit+1
      Case #PB_Event_Gadget
        If gadget=0
          ;If get
          pos=GetGadgetState(0)
          If FindString(GetGadgetItemText(0,pos),Chr(160),0)
            SetGadgetItemText(0,pos,ReplaceString(GetGadgetItemText(0,pos),Chr(160)," "))
            ;SetGadgetItemText(0,
          ;If GetGadgetItemAttribute(0,GetGadgetState(0)+1,#PB_Tree_SubLevel)=1 And GetGadgetItemText(0,GetGadgetState(0)+1)="pseudo"
          ;  RemoveGadgetItem(0,GetGadgetState(0)+1)
            AddGadgetItem(0,GetGadgetState(0)+1,"Eintrag 1",0,1)
            AddGadgetItem(0,GetGadgetState(0)+2,"Eintrag 2",0,1)
            AddGadgetItem(0,GetGadgetState(0)+3,"Eintrag 3",0,1)
            AddGadgetItem(0,GetGadgetState(0)+4,"Eintrag 4",0,1)
            SetGadgetItemState(0,GetGadgetState(0),#PB_Tree_Expanded)
          EndIf
        EndIf
    EndSelect
  Until quit
EndIf