大規模ソフトウェアを手探るその4 〜ツールチップの実装〜

こんにちは。

今回でこの課題も最後で、最後にツールバーのアイコンの上にマウスをおくとそのツールの説明が表示されるツールチップ機能の実装について書きます。

もともとGpaintにはこの機能はなく、しかもツールのアイコンもお世辞にもわかりやすいものであるとは言えず、ぜひともこの機能は欲しいと思っていました。

今まで通り実装の流れを書いていきます。

 

実はそもそもこういう機能は欲しいなとは思っていたものの機能の名前がわからず調べるのも一苦労でした(最初はオンマウスとかでググっていました)。調べていくうちにツールチップという機能であるとわかり、しかもネットに同じような実装をしている例がいろいろあったので試してみましたがエラーがたくさんでて上手くいきません。そこで原点に立ち返ってソースコードを眺めることにすると、ui.cで下のようにツールチップを設定している箇所がありました(よく考えるとウィンドウ上部にある保存ボタンや印刷ボタンにはもともと説明が表示されていたのであるのは当たり前でした)。

gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (print_button), tooltips, _("Print"), NULL);

 

あとはこれを流用すればよいと思いやってみましたが、下のようなエラーがでて上手くいきません。

(gpaint-2:10597): GLib-GObject-WARNING **: invalid cast from 'GtkToggleButton' to 'GtkToolItem'

(gpaint-2:10597): Gtk-CRITICAL **: IA__gtk_tool_item_set_tooltip: assertion 'GTK_IS_TOOL_ITEM (tool_item)' failed

どうやら上部の保存や印刷などのボタンと左側のツールバーのボタンは種類が違うらしく(前者がGtkToolItemで後者がGtkToggleButton)、下のように階層も異なっているため単純には流用できなかったようです。

 GObject
   +----GtkObject
         +----GtkWidget
               +----GtkContainer
                     +----GtkBin
                           +----GtkButton
                                 +----GtkToggleButton
                                       +----GtkCheckButton
GObject
   +----GtkObject
         +----GtkWidget
               +----GtkContainer
                     +----GtkBin
                           +----GtkToolItem
                                 +----GtkToolButton
                                 +----GtkSeparatorToolItem
 
従ってGtkToggleButtonの元のGtkButtonのツールチップ実装について調べると、gtk_tooltips_set_tip関数を使うと良いということがわかったので下のように加えてみたところ無事にツールチップが実装されました。

gtk_tooltips_set_tip (tooltips, erase_button , _("erase"), NULL);

f:id:sumesimeji:20151030000609j:plain

変更を加えたのはui.cとtool_palette.cのみです。

 

 

以上4回に渡ってフリーソフトGpaintにあれこれ機能を追加してみました。すでに完成された大規模なプログラムに手を加えるのは初めての試みでしたが、以外と何とかなるなというのが終わってみての感想です。これを機に多少のことには物怖じしないでプログラミングができるようになったのではないかと思います。

最後まで読んでいただきありがとうございました。