Seite 1 von 2
Gadgets von einem ContainerGadget ins andere schieben
Verfasst: 13.03.2014 00:02
von NicTheQuick
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.
Re: Gadgets von einem ContainerGadget ins andere schieben
Verfasst: 13.03.2014 00:08
von RSBasic
Unter Windows: SetParent_()
Unter Linux: gdk_window_reparent_()
Re: Gadgets von einem ContainerGadget ins andere schieben
Verfasst: 13.03.2014 00:29
von NicTheQuick
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.
Re: Gadgets von einem ContainerGadget ins andere schieben
Verfasst: 13.03.2014 18:19
von NicTheQuick
'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.
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
Re: Gadgets von einem ContainerGadget ins andere schieben
Verfasst: 13.03.2014 18:54
von NicTheQuick
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:
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
Hier im Einsatz:
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
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.

Re: Gadgets von einem ContainerGadget ins andere schieben
Verfasst: 13.03.2014 19:26
von RSBasic
Achso okay, dann sorry für meine falsche Information.

Ich dachte, es wär wie bei Windows.
PS: Der Beispielcode funktioniert unter Windows.
Re: Gadgets von einem ContainerGadget ins andere schieben
Verfasst: 13.03.2014 19:32
von NicTheQuick
RSBasic hat geschrieben:PS: Der Beispielcode funktioniert unter Windows.
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.
Re: Gadgets von einem ContainerGadget ins andere schieben
Verfasst: 13.03.2014 19:35
von RSBasic
ResizeGadget brauchst du unter Windows nicht, weil die Position mit übernommen wird.
Re: Gadgets von einem ContainerGadget ins andere schieben
Verfasst: 13.03.2014 19:43
von ts-soft
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
Re: Gadgets von einem ContainerGadget ins andere schieben
Verfasst: 14.03.2014 02:09
von ts-soft
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