PangoFontDescription

memopoli の読み書きとツリー移動がなんとかなったので本サイトで公開。
まだ実装していないメニュー項目があるし設定も何もないけど「まあいいや」で。

どうしても 2011 年中に間に合わせたかっただけだ!
こんな最小限の実装までにとうとう大晦日まで掛かってしまった…

memopoli ヘルプ – L’Isola di Niente

私的にたいしたことはやっていないと思うので blog に書くことが無い。
後は自分で利用(バグ出し)しながら細かい機能を実装していくつもり。

次にフォント設定をやろうと考えていきなり困った。
GTK+ ではフォント情報をどうやって保存するのだろう?

Fonts

Pango にpango_font_description_to_string という関数があるね。
そういえば以前フォント変更する方法だけはやっていた。

GtkFontChooserDialog | PaePoi

今頃気がついたが gtk_widget_modify_font は古いようだ。
gtk_widget_override_font にすればいいのね。
よし、この前回コードをフォント情報が保存できるように書き換えてみよう。

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

from gi.repository import Gtk, Gio, Pango

class Win(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.set_title("font test")
        entry = Gtk.Entry()
        entry.set_text("homurachan")
        button = Gtk.Button("Select Font")
        button.connect("clicked", self.on_clicked, entry)
        vbox = Gtk.VBox()
        vbox.pack_start(button, False, False, 0)
        vbox.pack_start(entry, False, False, 0)
        self.add(vbox)
        self.connect("delete-event", self.on_delete)
        # Config File Read
        try:
            f = open("font.conf", "r")
            s = f.read()
            f.close()
        except:
            s = "Monospace 16"
        # PangoFontDescription
        self.desc = Pango.font_description_from_string(s)
        entry.override_font(self.desc)
        self.show_all()

    def on_delete(self, widget, event):
        c = self.desc.to_string()
        f = open("font.conf", "w")
        f.write(c)
        f.close()

    def on_clicked(self, widget, entry):
        dlg = Gtk.FontChooserDialog("Select Font")
        if dlg.run() == Gtk.ResponseType.OK:
            self.desc = dlg.get_font_desc()
            #entry.modify_font(self.desc) # old Func
            entry.override_font(self.desc)
        dlg.destroy()

class App(Gtk.Application):
    def __init__(self):
        Gtk.Application.__init__(
                self,
                application_id="apps.test.font",
                flags=Gio.ApplicationFlags.FLAGS_NONE)
        self.connect("activate", self.on_activate)

    def on_activate(self, data=None):
        w = Win()
        w.set_application(self)

if __name__ == "__main__":
    app = App()
    app.run(None)

なるほど、単純に「フォント名 サイズ」文字列だけでいいのか。
これなら簡単だ、早速 memopoli に実装することにしよう。
メニューに乗せるかダイアログに入れるか、うーん…

ということで。

2011 年イッパイになったのでめでたく Y901, Palepoli 等の公開を終了。
早く消したかったけど我慢して一年も間をおいたので多分大丈夫だろう。
それでは良いお年を。