Hello, I would like to add a functionality in my filter plugin to display items in the edit view, like a reporter plugin. Is this easily possible? Thanks!
When the filter dialog is opened, register for a drawing callback and remove it when the dialog is closed.
I’m sorry, I don’t understand what that means. Could you provide a short code sample?
Ah! Of course. Thanks a lot!
One question, I’m not sure when to remove the callback. In which function do I do this?
The basic structure of the filter is
start (which is where I assume I add the callback), and
Do I perform
You could remove the callback in the methods that are called when you hit the OK and Cancel button.
I’m afraid I can’t find documentation on which methods those buttons call.
Depends on how you implement the dialog. If you use the .xib/.nib, you find it in the action inspector when the button is selected.
For details, have a look at the “plugins.py” file to see what the method does. you find the file in
I can’t find an action inspector in XCode, sorry.
plugins.py file, I’m unable to find which method is called when Cancel or Apply are clicked.
You have the .xib file open? Then select the button. Make sure the right sidebar is visible.
Hmm. I see what you mean, but for me,
ok Dialog doesn’t show up:
plugin.py itself doesn’t include the Cancel/Ok buttons, as those are automatically added by Glyphs.
For context, this is all I see:
I should have had a better look at this, sorry.
The relevant part is all in objcC. So you can’t find it.
You need to overwrite
and make sure to call super in both of them. so your code could look something like this:
def confirmDialog_(self, sender): objc.super(___yourClassName___, self). confirmDialog_(sender) removeCallback() def cancelDialog_(self, sender): objc.super(___yourClassName___, self). cancelDialog_(sender) removeCallback()
___yourClassName___ needs to be replaced with the name of your plugins class. Or try to use
self.__class__.__name__ (print both, of the two might have some extra stuff)
Thanks. I’m afraid I didn’t quite manage to set it up correctly.
I did the following:
# On dialog show @objc.python_method def start(self): self.set_fields() # Set focus to text field self.apertureTextField.becomeFirstResponder() Glyphs.addCallback(self.draw_calculations, DRAWFOREGROUND) @objc.python_method def draw_calculations(self, layer, info): try: NSColor.redColor().set() layer.bezierPath.fill() except: import traceback print(traceback.format_exc()) @objc.python_method def confirmDialog_(self, sender): objc.super(Inktrapeze, self).confirmDialog_(sender) Glyphs.removeCallback(self.draw_calculations) @objc.python_method def cancelDialog_(self, sender): objc.super(Inktrapeze, self).cancelDialog_(sender) Glyphs.removeCallback(self.draw_calculations)
But for some reason, once I close the dialogue, the drawings still are there (so, in this case, once I close the filter, the layer’s bezierPath is still displayed as red). What am I missing?
What happens if you scroll or zoom after yuu closed the dialog?
Nothing, the foreground stays red (also if I type new glyphs), until I re-open Glyphs.
You should not put
@objc.python_method on those callbacks. That hides it from the objectiveC run-time and thous the buttons are not triggering your methods.
That works! Thanks a lot for your patience and help.