4.11. アドオン GUI の高度な機能

pyanaconda パッケージには、ヘルパー関数やユーティリティー関数が複数含まれ、ハブやスポークで使用されるコンストラクトも含まれます。そのほとんどは、pyanaconda.ui.gui.utils パッケージにあります。

Hello World アドオンの例は、Anaconda も使用する englightbox コンテンツマネージャーの使用方法を示しています。このコンテンツマネージャーはウィンドウをライトボックスに入れ、可視性を高め、ユーザーの基礎となるウィンドウとの対話を防ぐことに重点を置くことができます。この機能を示すために、サンプルアドオンには新しいダイアログウィンドウを開くボタンが含まれています。ダイアログ自体は、pyanaconda.ui.gui.init で定義される GUIObject クラスから継承される特別な HelloWorldDialog です。

ダイアログクラスは、self.window 属性を介してアクセス可能な内部 Gtk ダイアログを実行および破棄する run メソッドを定義します。この属性は、同じ意味の mainWidgetName クラス属性を使用して設定されます。そのため、以下の例のようにダイアログを定義するコードは非常にシンプルです。

例4.9 englightbox Dialog の定義

        # every GUIObject gets ksdata in init
        dialog = HelloWorldDialog(self.data)

        # show dialog above the lightbox
        with self.main_window.enlightbox(dialog.window):
            dialog.run()

Defining an englightbox Dialog のサンプルコードは、ダイアログのインスタンスを作成してから、enlightbox コンテキストマネージャーを使用してライトボックス内でダイアログを実行します。コンテキストマネージャーにはスポークのウィンドウへの参照があり、ダイアログのライトボックスをインスタンス化するためにダイアログのウィンドウだけを必要とします。

Anaconda が提供するもう 1 つの便利な機能は、インストール時および最初の再起動後に表示されるスポークを定義する機能です。Initial Setup ユーティリティーは、「アドオングラフィカルユーザーインターフェース (GUI) のサポートの追加」 で説明されています。Anaconda と初期セットアップの両方でスポークを使用できるようにするには、pyanaconda.ui.common モジュールで定義される最初の継承クラスとして、特別な FirstbootSpokeMixIn クラス (別称 mixin) を継承する必要があります。

初期セットアップでのみ特定のスポークを利用可能にする場合は、このスポークは代わりに FirstbootOnlySpokeMixIn クラスを継承する必要があります。

pyanaconda パッケージは、@gtk_action_wait および @gtk_action_nowait デコレーターなど、より高度な機能を提供しますが、これらは本書の対象外となっています。その他の例については、インストーラーのソースを参照してください。