ReparentGadget / MoveFromContainer

Got an idea for enhancing PureBasic? New command(s) you'd like to see?
User avatar
NicTheQuick
Addict
Addict
Posts: 1504
Joined: Sun Jun 22, 2003 7:43 pm
Location: Germany, Saarbrücken
Contact:

ReparentGadget / MoveFromContainer

Post by NicTheQuick »

Hi there,

I wish I could move a Gadget from one Container to another without deleting and recreate it.

This code works without problems, but in complexer situations it does not work very well:

Code: Select all

 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 
The english grammar is freeware, you can use it freely - But it's not Open Source, i.e. you can not change it or publish it in altered way.
User avatar
NicTheQuick
Addict
Addict
Posts: 1504
Joined: Sun Jun 22, 2003 7:43 pm
Location: Germany, Saarbrücken
Contact:

Re: ReparentGadget / MoveFromContainer

Post by NicTheQuick »

For example the following code trying to move a ListIconGadget to a container does not work on Linux:

Code: Select all

 EnableExplicit

Define.i main, button, splitter
Global.i container1, container2, listicon

main = OpenWindow(#PB_Any, 0, 0, 800, 600, "test")

;Create a container
container1 = ContainerGadget(#PB_Any, 0, 0, 400, 600, #PB_Container_Raised)
   ;Erstelle ListIconGadget
   listicon = ListIconGadget(#PB_Any, 5, 5, 390, 590, "Log", 100)
CloseGadgetList()
SetGadgetColor(container1, #PB_Gadget_BackColor, $ff0000)

;Create a second container
container2 = ContainerGadget(#PB_Any, 400, 0, 400, 600, #PB_Container_Raised)
CloseGadgetList()C
SetGadgetColor(container2, #PB_Gadget_BackColor, $00ff00)

Procedure SetGadgetParent(GadgetID.i, ToContainerID.i)
   If (GadgetType(ToContainerID) = #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))
            ;see http://docs.knobbits.org/local/libgtk2.0-doc/faq/x626.html
            g_object_ref_(GadgetID(GadgetID))
            gtk_container_remove_(gtk_widget_get_parent_(GadgetID(GadgetID)), GadgetID(GadgetID))
            gtk_container_add_(GadgetID(ToContainerID), GadgetID(GadgetID))
            g_object_unref_(GadgetID(GadgetID))
            ResizeGadget(GadgetID, x, y, #PB_Ignore, #PB_Ignore)
            
         CompilerCase #PB_OS_Windows
            SetParent_(GadgetID(GadgetID), GadgetID(ToContainerID))
            
         CompilerCase #PB_OS_MacOS
         
      CompilerEndSelect
      
      ProcedureReturn #True
   EndIf
   
   ProcedureReturn #False
EndProcedure

SetGadgetParent(listicon, container2)

Repeat
   
Until WaitWindowEvent() = #PB_Event_CloseWindow 
But if I encapsulate the ListIconGadget in a ContainerGadgert, it works without problems.

Code: Select all

 EnableExplicit

Define.i main, button, splitter
Global.i container1, container2, listicon, listiconContainer

main = OpenWindow(#PB_Any, 0, 0, 800, 600, "test")

;Create a container
container1 = ContainerGadget(#PB_Any, 0, 0, 400, 600, #PB_Container_Raised)
   ;Create ListIconGadget
   listiconContainer = ContainerGadget(#PB_Any, 5, 5, 390, 590, #PB_Container_BorderLess)
      listicon = ListIconGadget(#PB_Any, 0, 0, 390, 590, "Log", 100)
   CloseGadgetList()
CloseGadgetList()
SetGadgetColor(container1, #PB_Gadget_BackColor, $ff0000)

;Create a second container
container2 = ContainerGadget(#PB_Any, 400, 0, 400, 600, #PB_Container_Raised)
CloseGadgetList()
SetGadgetColor(container2, #PB_Gadget_BackColor, $00ff00)

AddGadgetItem(listicon, -1, "Pure Power")

Procedure SetGadgetParent(GadgetID.i, ToContainerID.i)
   If (GadgetType(ToContainerID) = #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))
            ;see http://docs.knobbits.org/local/libgtk2.0-doc/faq/x626.html
            g_object_ref_(GadgetID(GadgetID))
            gtk_container_remove_(gtk_widget_get_parent_(GadgetID(GadgetID)), GadgetID(GadgetID))
            gtk_container_add_(GadgetID(ToContainerID), GadgetID(GadgetID))
            g_object_unref_(GadgetID(GadgetID))
            ResizeGadget(GadgetID, x, y, #PB_Ignore, #PB_Ignore)
            
         CompilerCase #PB_OS_Windows
            SetParent_(GadgetID(GadgetID), GadgetID(ToContainerID))
            
         CompilerCase #PB_OS_MacOS
         
      CompilerEndSelect
      
      ProcedureReturn #True
   EndIf
   
   ProcedureReturn #False
EndProcedure

SetGadgetParent(listiconContainer, container2)

AddWindowTimer(main, 0, 2000)

Repeat
   Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
         Break
      Case #PB_Event_Timer
         SetGadgetParent(listiconContainer, container1)
         Swap container1, container2
   EndSelect
ForEver 
The english grammar is freeware, you can use it freely - But it's not Open Source, i.e. you can not change it or publish it in altered way.
Post Reply