TreeGadget Falt-Button erzwingen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

TreeGadget Falt-Button erzwingen

Beitrag 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
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: TreeGadget Falt-Button erzwingen

Beitrag von Lambda »

Weiß denn niemand (weder hier noch engl.) ob, und wenn ja, wie das möglich wäre?
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3875
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: TreeGadget Falt-Button erzwingen

Beitrag 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
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: TreeGadget Falt-Button erzwingen

Beitrag 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.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3875
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: TreeGadget Falt-Button erzwingen

Beitrag 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
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: TreeGadget Falt-Button erzwingen

Beitrag 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.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3875
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: TreeGadget Falt-Button erzwingen

Beitrag 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
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten