Because there it seems that there is no source of this on internet, here
is a way to achieve this.
This is a hack, we are going to override the data parameter with the
page number instead of the C pointer to the widget.
===Code.py===
notebook = gtk.notebook()
drag_page_number = 0 # global var
notebook.connect_after(drag_begin, _sig_notebook_drag_begin)
notebook.connect_after(drag_data_get, _sig_notebook_drag_data_get)
# do not use drag_source_set on Notebook, you will get a Segmentation
Fault, use set_tab_detachable instead.
# https://bugs.launchpad.net/ubuntu/+source/pygtk/+bug/604534
# notebook.drag_source_set(gtk.gdk.BUTTON1_MASK, [], gtk.gdk.ACTION_COPY)
# add tabs to notebook
notebook.append_page(child_widget, label)
notebook.set_tab_detachable(child_widget, True)
...
def _sig_notebook_drag_begin(widget, context):
# Drag and drop begin, save current page number
drag_page_number = notebook.get_current_page()
def _sig_notebook_drag_data_get(widget, context, selection, info,
timestamp):
# Override the C pointer to the widget with page_number
selection.set(selection.target, 8, str(drag_page_number)) # data is
only of string type !
# The widget that will receive the drag and drop
button = gtk.Button(Test)
button.connect(drag_drop, _sig_drag_drop)
button.connect(drag_data_received, _sig_drag_data_received)
button.drag_dest_set(0, [], 0) # button can receive any drag and drop
def _sig_drag_drop(widget, context, x, y, time):
# widget = button here
if GTK_NOTEBOOK_TAB in context.targets:
widget.drag_get_data(context, GTK_NOTEBOOK_TAB)
context.finish(True, False, time)
return True
def _sig_drag_data_received(widget, context, x, y, selection, info,
timestamp):
# widget = button here
src_widget = context.get_source_widget() # src_widget = notebook here
the_page_number = int(selection.data)
child_widget = src_widget.get_nth_page(the_page_number)
===End of code===
Zyphos
Zyphos a écrit :
Hi,
I try to make a DND from a gtk.Notebook to another widget.
I receive the 'selection' on the other widget.
The documentation say:
The notebook will fill the selection with a reference to the child
widget that corresponds to the dropped tab.
Src:
http://library.gnome.org/devel/pygtk/stable/class-gtknotebook.html#method-gtknotebook--set-tab-detachable
Here is the selection of this DND ('drag-data-received'):
Selection: SelectionData: GtkSelectionData at 0xbfcc1cc4
.data: str: ��
.format: int: 8
.selection: str: XdndSelection
.target: str: GTK_NOTEBOOK_TAB
.type: str: GTK_NOTEBOOK_TAB
But selection.data is a string with this str: �� (I think this is a
pointer reference to the C code child widget) it isn't usable with Python.
How can I retrieve the notebook child widget which the DND come from ?
Thank you for any suggestion.
___
pygtk mailing list pygtk@daa.com.au
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://faq.pygtk.org/