GTK4 で GtkFileChooserNative を何故か作れない。
理由は解らないけど何をやっても無反応。
しかたがないので GtkFileChooserDialog を使う。
Open ボタンを青くしたいんだがどうすればいいのかな?
class ComipoliWindow(Gtk.ApplicationWindow):
def __init__(self, app):
Gtk.ApplicationWindow.__init__(self, application=app)
# etc...
def open_dialog(self):
ft = Gtk.FileFilter()
ft.set_name('Comic Book Archive')
ft.add_mime_type('application/x-cbz')
ft.add_mime_type('application/vnd.comicbook+zip')
if self.app.is_pdf:
ft.add_mime_type('application/pdf')
if self.app.is_unrar:
ft.add_mime_type('application/x-cbr')
if self.app.is_7za:
ft.add_mime_type('application/x-cb7')
#dialog = Gtk.FileChooserNative.new('Open', self, Gtk.FileChooserAction.OPEN, '_Open', '_Cancel')
dialog = Gtk.FileChooserDialog(title='Open', action=Gtk.FileChooserAction.OPEN, modal=True)
dialog.add_buttons('_Cancel', Gtk.ResponseType.CANCEL, '_Open', Gtk.ResponseType.ACCEPT)
dialog.set_transient_for(self)
dialog.add_filter(ft)
# CSS CLASS
open_button = dialog.get_widget_for_response(Gtk.ResponseType.ACCEPT)
open_button.add_css_class('suggested-action')
cancel_button = dialog.get_widget_for_response(Gtk.ResponseType.CANCEL)
cancel_button.add_css_class('destructive-action')
if len(self.archive) > 0:
d = GLib.path_get_dirname(self.archive.path)
dialog.set_current_folder(Gio.file_new_for_path(d))
dialog.connect('response', self.on_open_dialog_response)
dialog.show()
def on_open_dialog_response(self, dialog, response_id):
if response_id == Gtk.ResponseType.ACCEPT:
f = dialog.get_file()
self.set_uri(f.get_uri())
dialog.destroy()
add_css_class でイケた。
destructive-action は例です、本当は remove か destroy になる場合に指定します。
この add_css_class で指定する文字列なんですが。
GTK4 のほうで見つからないので GTK3 のヘルプを見る。
Gtk ? 3.0
Constants つまり定数の STYLE_*** の中身。
define されている文字列をそのまま書けば適用される。
いや小文字にしてアンダーバーをハイフンにすればいいんですけどね。
というかボタン用は上記2つしか無いんですけどね。
よく見ると title や subtitle のスタイルクラスもあるな。
ということは。
#!/usr/bin/env python3
from gi.repository import Gtk, Pango
class ComipoliHeaderBar(Gtk.HeaderBar):
def __init__(self):
Gtk.HeaderBar.__init__(self)
# LR Button
self.lr_button = Gtk.ToggleButton(label='L<-R', can_focus=False, focus_on_click=False)
self.pack_start(self.lr_button)
# Grid Button
self.grid_button = Gtk.Button(icon_name='view-grid-symbolic', can_focus=False, focus_on_click=False)
self.pack_start(self.grid_button)
# Main Title
self.title = Gtk.Label(label='', single_line_mode=True, ellipsize=Pango.EllipsizeMode.END)
self.title.add_css_class('title')
# Sub Title
self.subtitle = Gtk.Label(label='--', single_line_mode=True, ellipsize=Pango.EllipsizeMode.END)
self.subtitle.add_css_class('subtitle')
# Title pack
box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, valign=Gtk.Align.CENTER)
box.append(self.title)
box.append(self.subtitle)
self.set_title_widget(box)
# Menu Button pack @ after Window.__init__
def set_title(self, text):
self.title.set_label(text)
def set_subtitle(self, text):
self.subtitle.set_label(text)
def set_active(self, is_active):
self.title.set_sensitive(is_active)
前回の HeaderBar に試してみたらイケた、メッチャシンプルになった。
こんな手段があったのか、まだまだ勉強しなきゃ駄目だな。
GtkFileFilter は GTK3 とまったく同じでした。
いやー野鳥が見つからないとガンガン進むな、まさかの三日連続とは...