DialogLib und ScrollAreaGadget

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

DialogLib und ScrollAreaGadget

Beitrag von matbal »

Mit dem ScrollareaGadget scheint es in der DialogLib ein Problem zu geben:

Im Beispiel-Code erstelle ich ein ScrollAreaGadget, in dem ist ein Canvas mit der Größe 100x100 (definiert im XML-Code). Nach öffnen des Dialogs vergrößere ich den Scrollbereich und das Canvas auf die benötigte Größe. Bis hierher ist alles O.K.

Wenn ich jedoch die Fenstergröße ändere, ist der Scrollbereich und das Canvas wieder klein.

Code: Alles auswählen

EnableExplicit
Runtime Enumeration Windows
	#FormMain
EndEnumeration

Runtime Enumeration Gadgets
	#FormMain_Scrollarea_1
	#FormMain_Canvas
EndEnumeration



Define XML$, event

XML$ + "<?xml version='1.0' encoding='UTF-16'?>"
XML$ + ""
XML$ + "<dialogs>"
XML$ + "  <window flags='#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget' name='main' xpos='0' ypos='0' id='#FormMain'>"
XML$ + "    <vbox width='400' height='300' expand='item:1'>"
XML$ + "      <scrollarea id='#FormMain_Scrollarea_1'>"
XML$ + "        <canvas width='100' height='100' id='#FormMain_Canvas'/>"
XML$ + "      </scrollarea>"
XML$ + "    </vbox>"
XML$ + "  </window>"
XML$ + "</dialogs>"
XML$ + ""


ParseXML(0, XML$)
If XMLStatus(0) = #PB_XML_Success
   CreateDialog(#FormMain)
   If OpenXMLDialog(#FormMain, 0, "main")
      
      ; Scrollarea und Canvas vergrößern
      SetGadgetAttribute(#FormMain_Scrollarea_1, #PB_ScrollArea_InnerWidth, 600)
      SetGadgetAttribute(#FormMain_Scrollarea_1, #PB_ScrollArea_InnerHeight, 400)
      ResizeGadget(#FormMain_Canvas, 0, 0, 600, 400)
      ; Grafik in Canvas
      If StartDrawing(CanvasOutput(#FormMain_Canvas))
         LineXY(0, 0, 600, 400, #Blue)
         LineXY(0, 400, 600, 0, #Blue)
         StopDrawing()
      EndIf
      
      Repeat
         event = WaitWindowEvent()
      Until event = #PB_Event_CloseWindow
   EndIf
EndIf

Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Re: DialogLib und ScrollAreaGadget

Beitrag von Macros »

Hallo matbal,

das liegt nicht am ScrollareaGadget sondern ist generell eine Eigenschaft der Bibliothek. Ihr Zweck ist es basierend auf dem XML automatisch eine schöne Oberfläche zu generieren. Wenn du manuell die Größe änderst bekommt die Bibliothek das sozusagen nicht mit. Wird dann die Fenstergröße geändert passt die Bibliothek wieder alle Gadgets auf die Angaben im XML an, also auch das Canvas was wieder auf 100*100 gesetzt wird.

Du kannst, falls es eine einmalige Änderung ist den XML Knoten anpassen:

Code: Alles auswählen

EnableExplicit
Runtime Enumeration Windows
	#FormMain
EndEnumeration

Runtime Enumeration Gadgets
	#FormMain_Scrollarea_1
	#FormMain_Canvas
EndEnumeration



Define XML$, event, canvasNode

XML$ + "<?xml version='1.0' encoding='UTF-16'?>"
XML$ + ""
XML$ + "<dialogs>"
XML$ + "  <window flags='#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget' name='main' xpos='0' ypos='0' id='#FormMain'>"
XML$ + "    <vbox width='400' height='300' expand='item:1'>"
XML$ + "      <scrollarea id='#FormMain_Scrollarea_1'>"
XML$ + "        <canvas width='100' height='100' id='#FormMain_Canvas'/>"
XML$ + "      </scrollarea>"
XML$ + "    </vbox>"
XML$ + "  </window>"
XML$ + "</dialogs>"
XML$ + ""



ParseXML(0, XML$)
; XML Knoten identifizieren und Attribute setzen
canvasNode = XMLNodeFromPath(MainXMLNode(0),"/dialogs/window/vbox/scrollarea/canvas")
SetXMLAttribute(canvasNode,"width","600")
SetXMLAttribute(canvasNode,"height","400")

If XMLStatus(0) = #PB_XML_Success
   CreateDialog(#FormMain)
   If OpenXMLDialog(#FormMain, 0, "main")
      
      ; Scrollarea und Canvas vergrößern
      SetGadgetAttribute(#FormMain_Scrollarea_1, #PB_ScrollArea_InnerWidth, 600)
      SetGadgetAttribute(#FormMain_Scrollarea_1, #PB_ScrollArea_InnerHeight, 400)
      ;ResizeGadget(#FormMain_Canvas, 0, 0, 600, 400) funktioniert nicht
      ; Grafik in Canvas
      If StartDrawing(CanvasOutput(#FormMain_Canvas))
         LineXY(0, 0, 600, 400, #Blue)
         LineXY(0, 400, 600, 0, #Blue)
         StopDrawing()
      EndIf
      
      Repeat
         event = WaitWindowEvent()
      Until event = #PB_Event_CloseWindow
   EndIf
EndIf

Du musst allerdings den Dialog danach (oder nach jeder Größenanpassung erneut) öffnen.
Eine Alternative wäre nach jedem Resize erneut anzupassen (z.B. könntest du die Größe des größten Gadgets mit variabler Größe, also in dem Fall das ScrollArea, abfragen und bei Größenänderung dann wieder das Canvas Resizen)

Beides etwas umständlich, wie du merkst. Der Fall manuelle Größenänderungen in mit der Dialog Bibliothek zu kombinieren ist noch nicht vorgesehen.
Einen entsprechenden Feature Request gibt es schon im englischen Forum.
Zuletzt geändert von Macros am 05.06.2025 11:32, insgesamt 1-mal geändert.
Bild
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: DialogLib und ScrollAreaGadget

Beitrag von matbal »

Klingt logisch, danke für den Hinweis.
Macros hat geschrieben: 05.06.2025 09:54 Eine Alternative wäre nach jedem Resize erneut anzupassen (z.B. könntest du die Größe des größten Gadgets mit variabler Größe, also in dem Fall das ScrollArea, abfragen und bei Größenänderung dann wieder das Canvas Resizen)
Genauso umging ich das Problem. Kam mir nur falsch vor...

(Ich habe mein Programm mittlerweile ohne DialogLib umgeschrieben)
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: DialogLib und ScrollAreaGadget

Beitrag von HeX0R »

und wieso hast Du die innerwidth und -height nicht einfach ins xml integriert?

Code: Alles auswählen

<scrollarea innerwidth='600' innerheight='400' id='#FormMain_Scrollarea_1'>
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: DialogLib und ScrollAreaGadget

Beitrag von matbal »

Das war war Demo-Code, der das Problem zeigt. Im Originalprogramm von mir hängt die Größe vom gerade geladenen Bild ab.
Antworten