GtkStack GtkStackSwitcher GtkHeaderBar

GNOME 3.10 で誰でもすぐ気が付くこと。
nautilus, gnome-system-monitor 等のタイトルバーがコンテナに。

gnome_system_monitor

今までどおりとタッチパネルの両立を考えると上手い手段だよね。
タッチ操作では常に最大化、なのでタイトルバーにボタンを配置。
双方で別々に UI を作る必要がなくなる、違和感は最初だけだし。

メニューバーと右クリックを排除、アクティブウインドウが一画面。
アプリケーションメニューがスマホやタブレットのメニューボタン。
という考え方で UI を構築していけば勝手にタッチ対応、みたいに。

で、このタイトルバーにするにはどうするのかな。

GtkHeaderBar を作って set_titlebar() だけでいいようだ。
set_custom_title() で中心、pack_start() で左寄せにできる。
同じく GTK+ 3.10 で追加された GtkStack で Notebook みたいに使える。
GtkStackTransitionType にてアニメーションの指定まで可能。

#!/usr/bin/env python3

from gi.repository import Gtk

class Win(Gtk.Window):
    """
        Python with GTK+ 3.10 new widget
        GtkStack, GtkStackSwitcher, GtkHeaderBar
    """
    def __init__(self):
        Gtk.Window.__init__(self)
        # GtkStack
        stack = Gtk.Stack()
        stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT_RIGHT)
        # GtkStackSwitcher
        sw = Gtk.StackSwitcher()
        sw.set_stack(stack)
        # page1
        tv = Gtk.TextView()
        buf = tv.get_buffer()
        buf.set_text("This is a\nGtkTextView")
        stack.add_titled(tv, "view", "view")
        # page2
        label = Gtk.Label("This is a\nGtkLabel")
        stack.add(label)
        stack.child_set_property(label, "title", "label")
        # GtkHeaderBar
        hbar = Gtk.HeaderBar()
        hbar.set_custom_title(sw)
        hbar.set_show_close_button(True)
        self.set_titlebar(hbar)
        self.add(stack)
        self.resize(400, 200)
        self.show_all()

    def do_delete_event(self, event):
        Gtk.main_quit()

Win()
Gtk.main()

gtk_headerbar

gtk_stack_add_titled() で add と title 指定が一発。
調べると単なる gtk_container_add_with_properties() のラッパーみたい。
なので child_set_property() にて title を変更することもできる。

予想より簡単だったし今後はコレでいこうと思う。
問題は GnomeShell 以外の環境ではどういう見た目になるか…