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. :wink:

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. :D
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 :mrgreen: , 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