日別アーカイブ: 2022/11/27

GTK4: Adw.MessageDialog

GTK+ 4.10 にて Gtk.MessageDialog は廃止になる。
変わりに Gtk.AlertDialog を、とドキュメントには書いている。
しかし、Adw 1.2 には Adw.MessageDialog が追加されている。

Adw.MessageDialog

どちらを使えと?
まあ現状 AlertDialog は使えないしコッチを試してみよう。

Gtk のは GtkDialog ベースだったが Adw のは GtkWindow ベース。
DialogFlags や ButtonsType のような単純明快な定数も用意されていない。
heading にメッセージを body に詳細を、ということみたい。
GtkWindow ベースなので parent を NULL にすれば単体でも使える。

#!/usr/bin/env python3

import gi
gi.require_version('Adw', '1')
from gi.repository import Adw

class Win(Adw.MessageDialog):
    def __init__(self, a):
        Adw.MessageDialog.__init__(self, application=a)
        # Create
        self.set_heading('Message')
        self.set_body('body')
        self.add_response('ok', 'OK')

app = Adw.Application()
app.connect('activate', lambda a: Win(a).present())
app.run()

adw_message

親ウインドウが無いというメッセージは一応出るようです。
ついでに app の最短表記を思いついたので今後はコレで。
これだけじゃ使い道が解らないので普通なサンプルコード。

#!/usr/bin/env python3

import gi
gi.require_version('Gtk', '4.0')
gi.require_version('Adw', '1')
from gi.repository import Gtk, Adw

class Win(Gtk.ApplicationWindow):
    '''
        Adw: Sample Code
    '''
    def __init__(self, a):
        # Set Adwaita Style
        manager = Adw.StyleManager.get_default()
        manager.set_color_scheme(Adw.ColorScheme.DEFAULT)
        # init
        Gtk.ApplicationWindow.__init__(self, application=a)
        # Button
        button = Gtk.Button(label='This is Button\nShow Message Dialog')
        button.connect('clicked', self.on_button_clicked)
        # Toast
        self.toast = Adw.ToastOverlay(child=button)
        # pack
        box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        box.append(self.toast)
        self.set_child(box)
        self.set_default_size(600, 300)

    def on_button_clicked(self, button):
        dlg = Adw.MessageDialog.new(self, '何が撮りたい?', '選んでください')
        dlg.add_response('bird', '野鳥(_b)')
        dlg.add_response('portrait', 'ポートレート(_p)')
        dlg.add_response('train', '電車(_d)')
        dlg.connect('response', self.on_message_response)
        dlg.present()

    def on_message_response(self, dlg, response):
        match response:
            case 'bird':
                toast = Adw.Toast(title='貴方は変態です')
            case 'portrait':
                toast = Adw.Toast(title='貴方はスケベです')
            case 'train':
                toast = Adw.Toast(title='貴方は頭がおかしいです')
            case 'close':
                toast = Adw.Toast(title='Esc 押さないで')
            case _:
                toast = Adw.Toast(title='不明なレスポンス')
        self.toast.add_toast(toast)

app = Gtk.Application()
app.connect('activate', lambda a: Win(a).present())
app.run()

adw_message

定数が無いおかげでむしろ簡単になったって感じですね。
Alt キーのニーモニックも普通に使えるようです。
Python の match 文と相性がいいのも嬉しいです。
ついでに、ウインドウを小さくするとボタンが縦並びになったりする。

adw_message

なんだよ凄く便利じゃないの。
Adw.Toast ではモーダルにできないのでやはり必要ですね。
今後メッセージはこれでいこう。