らんだむな記憶

blogというものを体験してみようか!的なー

インスペクタービュー(3)

インスペクタービューにカスタムダイアログを貼り付けるには基本的に以下のようにすれば良いようだ。クラスメンバの名前について「この名前じゃないとダメ」というのもあるので注意が必要だ。
ダイアログのレイアウトは予めXcodeのInterface Builderなどで「InspectorView.xib」として書かれて、ibtool

ibtool --compile InspectorView.nib InspectorView.xib

のようにコンパイルされ「InspectorView.nib」が生成されていると想定している。

class MyTool(SelectTool):

    # このクラスメンバは「inspectorDialogView」である必要がある。
    # 基底クラスのSelectTool内でこのプロパティを参照するためだ。
    inspectorDialogView = objc.IBOutlet()

    def settings(self):
        ...
        # Load .nib file from package (without .extension)
        self.loadNib("InspectorView", __file__)

    # インスペクタービューに自身のダイアログしか表示させたくないなら
    # 基底クラスのinspectorViewControllersメソッドをオーバーライドして
    # 以下のようにする。
    def inspectorViewControllers(self):
        return [self]

inspectorViewControllers についてはGlyphsSDKの ObjectWrapper/GlyphsApp/plugins.py を読む必要がある。
オリジナルの実装は

    def inspectorViewControllers(self):
        ViewControllers = objc.super(SelectTool, self).inspectorViewControllers()
        if ViewControllers is None:
            ViewControllers = []
        try:
            # self.inspectorDialogView may also be defined witut a .nib,
            # so it could be a Vanilla dialog
            if self.inspectorDialogView:
                ViewControllers.append(self)
        
        except:
            self.logError(traceback.format_exc())
        
        return ViewControllers

であるのだが、これはデフォルトの ViewControllers に更に自身を付け加えているように読める。
よって、自身だけにしたいならデフォルト分を無視して [self] だけを返せば良い。
デフォルト実装のままだと、グリフ名+unicodeのダイアログとメトリクスのダイアログに加えてユーザー定義のダイアログが返るようだ。
ダイアログのlistの配置についてはGlyphsがよろしくやってくれているように見える。