Seite 1 von 1

TreeGadget und horizontale Scrollbar unter Linux

Verfasst: 16.01.2020 12:37
von kmais
hei, Leute ... und guten Tag.

Wieder mal eine "Herausforderung" :-).

TreeGadget und horizontale Scrollbar.
Sie wird nicht dargestellt unter qt und nur "andeutungsweise" unter GTK2 (minimaler Ausschnitt der bar)

Das ist wohl seit über 10 Jahren (nach Recherchen) ein Problem.
Unter Windows gibt es eine Lösung mit Hilfe der API, da das Problem anscheinend nur nach
einem ClearGadgetItem auftritt. Aber das benötigt man ja ständig.
Für Linux habe ich nichts gefunden.
Hat jemand dafür vielleicht eine Lösung bzw. einen workaround wie für Windows?

... Peter ...

Re: TreeGadget und horizontale Scrollbar unter Linux

Verfasst: 16.01.2020 21:11
von ccode_new
Da hast du aber gleich mal ein riesen PureBasic-Problem beschrieben.

Also 1. Es funktioniert grundsätzlich unter GTK2 und GTK3.

Das bei dir nur eingeschränkt Scrollbalken unter GTK2 - Subsystem kommen kann an deiner Linux-Distribution und/oder deinem GTK-GUI_Theme liegen. Es wäre hierbei auch wichtig welche GTK2 Version genutzt wird.

Also bei mir funktioniert es mit GTK2 und auch mit GTK3.

Nun kommen wir zu Punkt 2.

Das QT-Subsytem unter Purebasic ist noch recht fehlerhaft.
Außerdem liegt es beim TreeGadget an dem kniffligen QT-Unterbau.

Hier ist eine mögliche Lösung:

Code: Alles auswählen

CompilerIf #PB_Compiler_OS = #PB_OS_Linux And Subsystem("qt")
  
  Global Tree_0
  
  #Qt_ScrollBarAsNeeded = 0
  #Qt_ScrollBarAlwaysOff = 1
  #Qt_ScrollBarAlwaysOn = 2
  
  #Qt_ScrollPerItem = 0
  #Qt_ScrollPerPixel = 1
  
  Runtime Procedure QtSignalHandler()
    QtScript("gadget("+Str(Tree_0)+").resizeColumnToContents(function() { 0 })")
  EndProcedure
  
  Procedure OpenWindow_0(x = 0, y = 0, width = 400, height = 400)
    Window_0 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu)
    Tree_0 = TreeGadget(#PB_Any, 10, 10, 380, 380)
    QtScript("gadget("+Str(Tree_0)+").horizontalScrollBarPolicy = "+Str(#Qt_ScrollBarAsNeeded))
    QtScript("gadget("+Str(Tree_0)+").horizontalScrollMode = "+Str(#Qt_ScrollPerPixel))
    QtScript("gadget("+Str(Tree_0)+").verticalScrollBarPolicy = 0")
    QtScript("gadget("+Str(Tree_0)+").columnCount = 1")
    
    QtScript("gadget("+Str(Tree_0)+~").itemExpanded.connect(function() { runtime.call(\"QtSignalHandler()\") })")
    QtScript("gadget("+Str(Tree_0)+~").itemCollapsed.connect(function() { runtime.call(\"QtSignalHandler()\") })")
    
    QtScript("gadget("+Str(Tree_0)+").headerHidden = 1")
    
    For i = 0 To 19
      AddGadgetItem(Tree_0, i, "Eintrag "+Str(i+1),0, i)
    Next
    
    ;Debug QtScript("dump(gadget("+Str(Tree_0)+"))")
    
  EndProcedure
  
  Procedure Window_0_Events(event)
    Select event
      Case #PB_Event_CloseWindow
        ProcedureReturn #False
        
      Case #PB_Event_Menu
        Select EventMenu()
        EndSelect
        
      Case #PB_Event_Gadget
        Select EventGadget()
        EndSelect
    EndSelect
    ProcedureReturn #True
  EndProcedure
  
  OpenWindow_0()
  Repeat
    
  Until Not Window_0_Events(WindowEvent())
  
CompilerElse
  Debug "Bitte nutzen Sie Linux und das QT-Subsystem zum probieren."
CompilerEndIf

Re: TreeGadget und horizontale Scrollbar unter Linux

Verfasst: 17.01.2020 18:41
von ccode_new
Neu: siehe oben

Re: TreeGadget und horizontale Scrollbar unter Linux

Verfasst: 18.01.2020 11:12
von ccode_new
Hallo: Die expandAll() Funktion ist irgendwie total Fehlerhaft.
Probiert mal das Wiedereinklappen.

Code: Alles auswählen

CompilerIf #PB_Compiler_OS = #PB_OS_Linux And Subsystem("qt")
 
  Global Tree_0
 
  #Qt_ScrollBarAsNeeded = 0
  #Qt_ScrollBarAlwaysOff = 1
  #Qt_ScrollBarAlwaysOn = 2
 
  #Qt_ScrollPerItem = 0
  #Qt_ScrollPerPixel = 1
 
  Runtime Procedure QtSignalHandler()
    QtScript("gadget("+Str(Tree_0)+").resizeColumnToContents(function() { 0 })")
  EndProcedure
 
  Procedure OpenWindow_0(x = 0, y = 0, width = 400, height = 400)
    Window_0 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu)
    Tree_0 = TreeGadget(#PB_Any, 10, 10, 380, 380)
    QtScript("gadget("+Str(Tree_0)+").horizontalScrollBarPolicy = "+Str(#Qt_ScrollBarAsNeeded))
    QtScript("gadget("+Str(Tree_0)+").horizontalScrollMode = "+Str(#Qt_ScrollPerPixel))
    QtScript("gadget("+Str(Tree_0)+").verticalScrollBarPolicy = 0")
    QtScript("gadget("+Str(Tree_0)+").columnCount = 1")
   
    QtScript("gadget("+Str(Tree_0)+~").itemExpanded.connect(function() { runtime.call(\"QtSignalHandler()\") })")
    QtScript("gadget("+Str(Tree_0)+~").itemCollapsed.connect(function() { runtime.call(\"QtSignalHandler()\") })")
   
    QtScript("gadget("+Str(Tree_0)+").headerHidden = 1")
   
    Global pos.s = ""
    Runtime pos
    QtScript(~"runtime.set(\"pos\", gadget("+Str(Tree_0)+").pos);")
  
    QtScript(~"var p = \"2, 2\"; gadget("+Str(Tree_0)+~").pos = p; runtime.set(\"pos\", p);")
    QtScript(~"runtime.set(\"pos\", gadget("+Str(Tree_0)+").pos);")
   
    QtScript(~"var p1 = 300; var p2 = 300; gadget("+Str(Tree_0)+~").size.height = p1; gadget("+Str(Tree_0)+~").size.width = p2;")   
   
    For i = 0 To 19
      AddGadgetItem(Tree_0, i, "Eintrag "+Str(i+1),0, i)
    Next
   
    QtScript("gadget("+Str(Tree_0)+").expandAll(function() { 0 })")
   
    Debug QtScript("dump(gadget("+Str(Tree_0)+"))")
   
  EndProcedure
 
  Procedure Window_0_Events(event)
    Select event
      Case #PB_Event_CloseWindow
        ProcedureReturn #False
       
      Case #PB_Event_Menu
        Select EventMenu()
        EndSelect
       
      Case #PB_Event_Gadget
        Select EventGadget()
          Case Tree_0
            If EventType() = #PB_EventType_RightClick
              RemoveGadgetItem(Tree_0, GetGadgetState(Tree_0))
            EndIf
        EndSelect
    EndSelect
    ProcedureReturn #True
  EndProcedure
 
  OpenWindow_0()
  Repeat
   
  Until Not Window_0_Events(WindowEvent())
 
CompilerElse
  Debug "Bitte nutzen Sie Linux und das QT-Subsystem zum probieren."
CompilerEndIf