So lets say you're writing a PyObjC application, and you're deciding how you'll represent your data. You fire open a nib (xib, these days) and stare at
NSOutlineViewfor a while before picking one of the two. Lets say you chose
NSOutlineView. You're going to need a way to create new nodes. Well, no sweat, just throw an
NSButtoninto the fray and use the
NSAddTemplateicon to make it clear what it does.
Here comes the big question though: how do you remove data from your shiny new
NSOutlineView? The easy answer is to add another button (perhaps with the
NSRemoveTemplateicon, you audacious rascal). If you're feeling really ambitious you may even bind a key to that button so that the delete key works.
Let a little time pass, though, and you'll start to have a nagging feeling. Something just doesn't feel right. You're never using that remove button, you're always pressing the delete key. Hell, once you meant to hit add and accidentally deleted something. You're finally ready to accept the truth: you just want to press the delete key, and you don't want no stinking remove button.
To accomplish that you'll need to subclass
NSTableViewif thats what you're using). It'll look like this:
fromFoundationimport*classWRLOutlineView(NSOutlineView):defkeyDown_(self,event):key=event.charactersIgnoringModifiers()flags=event.modifierFlags()&0x00FFiford(key)==127andflags==0:# Do your removal magic here.passelse:super(DeletableOutlineView,self).keyDown_(event)
Its a pretty simple trick, but can be a bit confusing to figure out. Specifically, it can be bewildering to try to figure out what non-textual characters are in Python. Here it was difficult to figure out how to reference the delete character so that I could check to see if the incoming key was a match. Thankfully the builtin function
ordturns ascii characters into their integer value, which made the comparison easy.
For completeness, here is the code I was using to actually remove the node from the table. At the line
# Do your removal magic here.I had the code:
I was using a custom datasource and delegate, and in the delegate the
removeList_method looked like this:
In that snippet
self.datais an instance of a class containing my tree structure, and
self.data.removeis a method that will recursively search the tree structure to remove the node supplied as the argument.
I'll be continuing to scribble down these short PyObjC tips and tricks as I run into them, so let me know if there is anything you're particularly interested in looking at and I'll merrily investigate.
我总是s glad to hear your questions and comments.