Gadgets von einem ContainerGadget ins andere schieben
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Gadgets von einem ContainerGadget ins andere schieben
Hi Leute,
entweder bin ich blind oder Purebasic kann das einfach nicht. Wie kann ich nachträglich ein Gadget von einem ContainerGadget in ein anderes verschieben ohne es zwischendurch löschen zu müssen?
Falls das bei Windows nur mit API geht, würde ich mich über Tipps dazu freuen. Wie das unter Linux geht, muss ich dann selbst schauen oder abwarten, ob es mir jemand sagen kann.
entweder bin ich blind oder Purebasic kann das einfach nicht. Wie kann ich nachträglich ein Gadget von einem ContainerGadget in ein anderes verschieben ohne es zwischendurch löschen zu müssen?
Falls das bei Windows nur mit API geht, würde ich mich über Tipps dazu freuen. Wie das unter Linux geht, muss ich dann selbst schauen oder abwarten, ob es mir jemand sagen kann.
Re: Gadgets von einem ContainerGadget ins andere schieben
Unter Windows: SetParent_()
Unter Linux: gdk_window_reparent_()
Unter Linux: gdk_window_reparent_()
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: Gadgets von einem ContainerGadget ins andere schieben
Oha, das ging ja schnell. Danke! 
Ich finde das eigentlich deswegen komisch, weil man z.B. beim SplitterGadget die enthaltenen Gadgets nachträglich ändern kann. Beim Container nicht. Aber so ist's dann ja wunderbar. Dann kann ich das morgen bestimmt einbauen.

Ich finde das eigentlich deswegen komisch, weil man z.B. beim SplitterGadget die enthaltenen Gadgets nachträglich ändern kann. Beim Container nicht. Aber so ist's dann ja wunderbar. Dann kann ich das morgen bestimmt einbauen.
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: Gadgets von einem ContainerGadget ins andere schieben
'gdk_window_reparent_()' war übrigens falsch. Das ist nur für Fenster.
Wenn man Gadgets von einem Container in einen anderen verschieben will, dann muss man 'gtk_widget_reparent_()' nutzen.
Ein billiger Beispielcode für Linux wäre dann der folgende. Interessant ist unter anderem auch, dass man die Position des Gadgets nach dem 'Reparenting' erneut setzen muss, sonst steht es einfach in der oberen linken Ecke.
Wenn man Gadgets von einem Container in einen anderen verschieben will, dann muss man 'gtk_widget_reparent_()' nutzen.
Ein billiger Beispielcode für Linux wäre dann der folgende. Interessant ist unter anderem auch, dass man die Position des Gadgets nach dem 'Reparenting' erneut setzen muss, sonst steht es einfach in der oberen linken Ecke.
Code: Alles auswählen
Define.i main, button, splitter
Global.i container1, container2
main = OpenWindow(#PB_Any, 0, 0, 800, 600, "test")
container1 = ContainerGadget(#PB_Any, 0, 0, 800, 300, #PB_Container_Raised)
button = ButtonGadget(#PB_Any, 5, 5, 100, 30, "Oben")
CloseGadgetList()
container2 = ContainerGadget(#PB_Any, 0, 300, 800, 300, #PB_Container_Raised)
CloseGadgetList()
splitter = SplitterGadget(#PB_Any, 0, 0, 800, 600, container1, container2, #PB_Splitter_SecondFixed)
Procedure change()
Protected button.i = EventGadget()
If (GetGadgetText(button) = "Oben")
gtk_widget_reparent_(GadgetID(button), GadgetID(container2))
SetGadgetText(button, "Unten")
ResizeGadget(button, 5, 5, 100, 30)
Else
gtk_widget_reparent_(GadgetID(button), GadgetID(container1))
SetGadgetText(button, "Oben")
ResizeGadget(button, 5, 5, 100, 30)
EndIf
EndProcedure
BindGadgetEvent(button, @change())
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: Gadgets von einem ContainerGadget ins andere schieben
Ich habe jetzt mal eine kurze Procedure dafür gebastelt und auch die WinAPI eingebaut. Könnte das mal bitte ein Windows-Nutzer für mich testen und wenn es falsch ist korrigieren?
Hier die Procedure:
Hier im Einsatz:
Jetzt könnte man das natürlich auch noch erweitern für das PanelGadget und das ScrollAreaGadget. Aber dafür habe ich gerade keine Zeit. 
Hier die Procedure:
Code: Alles auswählen
Procedure SetGadgetParent(GadgetID.i, ContainerID.i)
If (GadgetType(ContainerID) = #PB_GadgetType_Container)
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux
Protected x.i = GadgetX(GadgetID), y.i = GadgetY(GadgetID)
gtk_widget_reparent_(GadgetID(GadgetID), GadgetID(ContainerID))
ResizeGadget(GadgetID, x, y, #PB_Ignore, #PB_Ignore)
CompilerCase #PB_OS_Windows
SetParent_(GadgetID(GadgetID), GadgetID(ContainerID))
CompilerCase #PB_OS_MacOS
CompilerEndSelect
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Code: Alles auswählen
Define.i main, button, splitter
Global.i container1, container2
main = OpenWindow(#PB_Any, 0, 0, 800, 600, "test")
container1 = ContainerGadget(#PB_Any, 0, 0, 800, 300, #PB_Container_Raised)
button = ButtonGadget(#PB_Any, 5, 5, 100, 30, "Oben")
CloseGadgetList()
container2 = ContainerGadget(#PB_Any, 0, 300, 800, 300, #PB_Container_Raised)
CloseGadgetList()
splitter = SplitterGadget(#PB_Any, 0, 0, 800, 600, container1, container2, #PB_Splitter_SecondFixed)
Procedure SetGadgetParent(GadgetID.i, ContainerID.i)
If (GadgetType(ContainerID) = #PB_GadgetType_Container)
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux
Protected x.i = GadgetX(GadgetID), y.i = GadgetY(GadgetID)
gtk_widget_reparent_(GadgetID(GadgetID), GadgetID(ContainerID))
ResizeGadget(GadgetID, x, y, #PB_Ignore, #PB_Ignore)
CompilerCase #PB_OS_Windows
SetParent_(GadgetID(GadgetID), GadgetID(ContainerID))
CompilerCase #PB_OS_MacOS
CompilerEndSelect
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure change()
Protected button.i = EventGadget()
If (GetGadgetText(button) = "Oben")
SetGadgetParent(button, container2)
SetGadgetText(button, "Unten")
Else
SetGadgetParent(button, container1)
SetGadgetText(button, "Oben")
EndIf
EndProcedure
BindGadgetEvent(button, @change())
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow

Re: Gadgets von einem ContainerGadget ins andere schieben
Achso okay, dann sorry für meine falsche Information. 
Ich dachte, es wär wie bei Windows.
PS: Der Beispielcode funktioniert unter Windows.

Ich dachte, es wär wie bei Windows.
PS: Der Beispielcode funktioniert unter Windows.
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: Gadgets von einem ContainerGadget ins andere schieben
Kannst du mal schauen, ob man das 'Resize()', was man unter Linux braucht, unter Windows tatsächlich weg lassen kann? Im Beispiel ist der Button nur um 5,5 verschoben. Deswegen fällt es vielleicht nicht auf den ersten Blick auf.RSBasic hat geschrieben:PS: Der Beispielcode funktioniert unter Windows.
Re: Gadgets von einem ContainerGadget ins andere schieben
ResizeGadget brauchst du unter Windows nicht, weil die Position mit übernommen wird.
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: Gadgets von einem ContainerGadget ins andere schieben
Das Resize ist unter Windows nicht erforderlich (wird man aber trotzdem in den meisten Fällen machen, bei Statusbar,
Toolbar o. ä.. Mich interessiert mehr, ob es auch mit ToolBar und Statusbar unter Linux funktioniert.
Werde es notfalls später, sobald ich wieder unter Linux bin, selber testen.
Fehlt nur noch die Äpfelchen-Lösung
, wie so oft.
Gruß
Thomas
Toolbar o. ä.. Mich interessiert mehr, ob es auch mit ToolBar und Statusbar unter Linux funktioniert.
Werde es notfalls später, sobald ich wieder unter Linux bin, selber testen.
Fehlt nur noch die Äpfelchen-Lösung

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: Gadgets von einem ContainerGadget ins andere schieben
Toolbar und Statusbar funktionieren, sollte man aber testen, ob noch alle benötigte Events durchkommen:
Code: Alles auswählen
If OpenWindow(0, 0, 0, 300, 125, "ToolBar", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If CreateStatusBar(0, WindowID(0))
EndIf
If CreateToolBar(0, WindowID(0))
ToolBarStandardButton(0, #PB_ToolBarIcon_New)
ToolBarStandardButton(1, #PB_ToolBarIcon_Open)
ToolBarStandardButton(2, #PB_ToolBarIcon_Save)
EndIf
StringGadget(0, 150, 0, 80, 20, "Test")
StringGadget(1, 10, 2, 80, 20, "Test")
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
SetParent_(GadgetID(0), ToolBarID(0))
SetParent_(GadgetID(1), StatusBarID(0))
CompilerElse
gtk_widget_reparent_(GadgetID(0), ToolBarID(0))
gtk_widget_reparent_(GadgetID(1), StatusBarID(0))
CompilerEndIf
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow : Break
Case #PB_Event_Menu
Debug "ToolbarID: " + EventMenu()
Case #PB_Event_Gadget
Select EventGadget()
Case 0
Debug "Text in StringGadget in Toolbar Changed"
Case 1
Debug "Text in StringGadget in Statusbar Changed"
EndSelect
EndSelect
ForEver
EndIf
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
