diff --git a/bin/keyboardcomposer b/bin/keyboardcomposer --- a/bin/keyboardcomposer +++ b/bin/keyboardcomposer @@ -18,6 +18,7 @@ from light9.subclient import SubClient from light9 import dmxclient, showconfig, networking, prof from light9.uihelpers import toplevelat, bindkeys from light9.namespaces import L9 +from light9.tkdnd import initTkdnd, dragSourceRegister from bcf2000 import BCF2000 nudge_keys = { @@ -73,6 +74,9 @@ class SubmasterTk(Frame): self.scale.pack(side=BOTTOM, expand=1, fill=BOTH) bindkeys(self, "", self.launch_subcomposer) + for w in [self, namelabel, levellabel]: + dragSourceRegister(w, 'copy', 'text/uri-list', sub.uri) + def launch_subcomposer(self, *args): subprocess.Popen(["bin/subcomposer", "--no-geometry", self.name]) @@ -465,6 +469,8 @@ if __name__ == "__main__": s = Submasters(graph) root = Tk() + initTkdnd(root.tk, 'tkdnd/trunk/') + tl = toplevelat("Keyboard Composer", existingtoplevel=root) startLevels = None diff --git a/light9/tkdnd.py b/light9/tkdnd.py new file mode 100644 --- /dev/null +++ b/light9/tkdnd.py @@ -0,0 +1,29 @@ +from glob import glob +from os.path import join, basename + +def initTkdnd(tk, tkdndBuildDir): + """ + pass the 'tk' attribute of any Tkinter object, and the top dir of + your built tkdnd package + """ + tk.call('source', join(tkdndBuildDir, 'library/tkdnd.tcl')) + for dll in glob(join(tkdndBuildDir, + '*tkdnd*' + tk.call('info', 'sharedlibextension'))): + tk.call('tkdnd::initialise', + join(tkdndBuildDir, 'library'), + join('..', basename(dll)), + 'tkdnd') + +def dragSourceRegister(widget, + action='copy', datatype='text/uri-list', data=''): + widget.tk.call('tkdnd::drag_source', 'register', widget._w) + + # with normal Tkinter bind(), the result of your handler isn't + # actually returned so the drag doesn't get launched. This is a + # corrected version of what bind() does when you pass a function, + # but I don't block my tuple from getting returned (as a tcl list) + funcId = widget._register(lambda: (action, datatype, data), + widget._substitute, + 1 # needscleanup + ) + widget.bind("<>", funcId)