GtkInfoBar

Part III. GTK+ Widgets and Objects

何か Linux とか GTK+ とかで新しいプログラミングのネタは無いものか…
なんて考えながら上記ををポッケーと眺めていた。

いきなり見つかったぞ、GtkInfoBar って何?

調べてみると例えば Gedit に動画ファイルをドロップしたエラーで出るあの少し大きなバー。
やれば解るので細かいことは書かないけど、ソレをわざわざ GTK+ 部品の一つにしたようだ。

GTK+ – Wikipedia, the free encyclopedia

GTK+ 2.18 で追加されたようだけど PyGtk から使えるのかな?
自前環境にて PyGtk から使えるか調べてみる。

Mandriva 2010.0 の GTK+ 2.20.0 と PyGtk 2.16 では使えない。
Ubuntu 10.04 の GTK+ 2.21.1 と PyGtk 2.17 では使える。

PyGTK 2.0 Reference Manual

こっちには今現在はマニュアルは無い、てかまだ version 2.15.2 のままのようで。
ドキュメントが遅れるのは Linux ではしかたがない、商売でやっている MSDN とは違うのだから。

しかしこの程度のインフォメーション表示バーなんて自作しても別に難しくない。
でも GTK+ 自体は GUI 部品の見た目統一を目指しているはずだし(違ったかな?
テーマ切り替え時の追従なんかも期待できる、Opera がまったく追従しないのが気になって…
とにかくせっかくベンダーが用意してくれたものだから使ってみよう。

GtkDialog の vbox アトリビュートのようなものは存在しない。
これ自体が GtkHBox サブクラスであらかじめボタン配置用スペースを予約しているみたい。
とりあえずボタンを押すと InfoBar が出てレスポンスでボタン文字を変更する例を。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import gtk

class InfoBarTest(gtk.Window):
    """
        GtkInfoBar Test
        PyGtk 2.17 or later.
    """
    def __init__(self):
        gtk.Window.__init__(self)
        vbox = gtk.VBox()
        vbox.show()
        self.button = gtk.Button("Click!")
        self.button.show()
        # GtkInfoBar
        self.infobar = gtk.InfoBar()
        self.infobar.pack_start(gtk.Label("Hi!\nButton Click"))
        self.infobar.add_button("_Cancel", gtk.RESPONSE_CANCEL)
        self.infobar.add_button(gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)
        # Signal
        self.infobar.connect("response", self.on_infobar_response)
        self.button.connect("button-press-event", self.on_click)
        self.connect("delete-event", gtk.main_quit)
        # append
        vbox.pack_start(self.infobar, False)
        vbox.pack_start(self.button)
        self.add(vbox)
        self.resize(300, 300)
        self.show()
        
    def on_click(self, widget, event=None):
        self.infobar.show_all()

    def on_infobar_response(self, widget, response_id):
        if response_id == gtk.RESPONSE_ACCEPT:
            self.button.set_label("OK!")
        else:
            self.button.set_label("Cancel...")
        self.infobar.hide()

if __name__ == "__main__":
    w = InfoBarTest()
    gtk.main()

バインディングは他の GTK+ 部品と同様みたい、これなら得にマニュアルは不要か。
後はチマチマ弄くってみればもっと見た目とかもよくなると思う。

うん、StatusBar や TitleBar では面積が足りない場合なんかに有効だ。
上手く使えば Debug にも利用できそう、自作すればいいとはいわない。

というか自作すればいいというのなら GtkMessageDialog なんかもいらないわけで。
「ナンデモアリ」を徹底的にやった結果として複雑怪奇になった WPF は見習ってほしいよ。