Gtk Next/Prev Dialog

Fedora を 32 (GNOME 3.36) にして一ヶ月たった。
今更気が付いたんだけーが GtkMessageDialog のバグが直っている。

GNOME 3.34 modal dialog bug | Paepoi Blog

この時に拙作 Comipoli は GtkInfoBar に変更した、そのまんまだ。
コレってフルスクリーンで cbz を見ていた時には解り辛いんだよね。
ダイアログのほうが視覚的に理解しやすいので元に戻すことにした。

戻すだけじゃつまらない、何か機能の追加か変更をしたい。
pixivコミックやニコニコ漫画のように「前の話」機能を追加することに。
って、GtkMessageDialog では YES/NO しか選択できないんだが。

ということで、GtkDialog を使って自作することにした。
Prev のショートカットはどうするか、Enter/Esc は勝手にやってくれるが。
ええい面倒だ、ニーモニックをそのまま描写しちゃえばいいや!

#!/usr/bin/env python3

from gi.repository import Gtk

class ComipolNextDialog(Gtk.Dialog):
    def __init__(self, text):
        Gtk.Dialog.__init__(self)
        self.set_resizable(False)
        # Buttons
        self.add_button('_Cancel (ESC)', Gtk.ResponseType.CLOSE)
        self.add_button('_Next (Enter)', Gtk.ResponseType.YES)
        self.add_button('_Prev (Alt+P)', Gtk.ResponseType.NO)
        self.set_default_response(Gtk.ResponseType.YES)
        # Message
        message = Gtk.Label(label=f'<span bgcolor="#CC0099">Next:</span> {text}', use_markup=True, visible=True)
        self.vbox.pack_start(message, False, False, 30)

こうなった。
YES/NO は最適なものが無いので簡易利用しただけ。
ボタン自体にショートカットが書いてある親切な仕様になってしまった。

んで呼び出し。
一つ前が存在しない時はボタンを無効にする必要があるなと。

dlg = ComipolNextDialog(html.escape(cbzs[next_index]))
dlg.set_transient_for(self)
if next_index < 2:
    dlg.set_response_sensitive(Gtk.ResponseType.NO, False)
res = dlg.run() 
if res == Gtk.ResponseType.YES:
    uri = GLib.filename_to_uri(GLib.build_filenamev([path, cbzs[next_index]]), None)
    self.set_uri(uri)
elif res == Gtk.ResponseType.NO:
    uri = GLib.filename_to_uri(GLib.build_filenamev([path, cbzs[next_index - 2]]), None)
    self.set_uri(uri)
dlg.destroy()

コレでイケた。
どんな感じに表示されるか。

dlg

うーん、GtkMessageDialog よりボタンの大きさが小さいなぁ。
勝手に等間隔にはなるけど長いファイル名だと右に寄ってしまうし。
アクションエリアにアクセスが非推奨ではどうにもできない。
タイトルバーも出るんだね、無しにしたいけど手段が解らない。
iPhone を考えるとあのスタイルが普通になるのよね今後は。

とはいえ動作は問題無しなのでコレでいこう。