TreeGadget und horizontale Scrollbar unter Linux

Für allgemeine Fragen zur Programmierung mit PureBasic.
kmais
Beiträge: 45
Registriert: 09.02.2017 13:54

TreeGadget und horizontale Scrollbar unter Linux

Beitrag 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 ...
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: TreeGadget und horizontale Scrollbar unter Linux

Beitrag 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
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: TreeGadget und horizontale Scrollbar unter Linux

Beitrag von ccode_new »

Neu: siehe oben
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: TreeGadget und horizontale Scrollbar unter Linux

Beitrag 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
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Antworten