GTK4: DirectoryList

Gtk.DirectoryList

こんなものを今更見つけた。
g_file_enumerate_children_async をラップしているらしい。
つまりコレを使えばファイルマネージャみたいな UI が簡単に作れるようだ。

しかしコレだけじゃどうやって使うのかちっともわからんぞ。
誰かサンプルコードでも書いていないか、探す。

GitHub – ToshioCP/Gtk4-tutorial: A gtk4 tutorial for beginners

おぉありがとう、なんと日本人ではないですか。
Ruby 屋さんのようですがごめん、筆者は PyGObject でやる。
ListItem.get_item で Gio.FileInfo が得られるようで。

#!/usr/bin/env python3

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

class Win(Gtk.ApplicationWindow):
    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)
        #
        f = Gio.File.new_for_path('.')
        ls = Gtk.DirectoryList(file=f, attributes='standard::name,standard::content-type,standard::size')
        #
        sel_model = Gtk.SingleSelection(model=ls)
        #
        factory1 = Gtk.SignalListItemFactory()
        factory1.connect('setup', self.on_listitem_setup)
        factory1.connect('bind', self.on_listitem_bind1)
        #
        factory2 = Gtk.SignalListItemFactory()
        factory2.connect('setup', self.on_listitem_setup)
        factory2.connect('bind', self.on_listitem_bind2)
        #
        factory3 = Gtk.SignalListItemFactory()
        factory3.connect('setup', self.on_listitem_setup)
        factory3.connect('bind', self.on_listitem_bind3)
        #
        columnview = Gtk.ColumnView(model=sel_model)
        columnview.connect('activate', self.on_columnview_activate)
        #
        column1 = Gtk.ColumnViewColumn(title='Filename', factory=factory1)
        columnview.append_column(column1)
        column2 = Gtk.ColumnViewColumn(title='ContentType', factory=factory2)
        columnview.append_column(column2)
        column3 = Gtk.ColumnViewColumn(title='Size', factory=factory3)
        columnview.append_column(column3)
        #
        self.set_child(columnview)

    def on_listitem_setup(self, factory, item):
        item.set_child(Gtk.Label(xalign=0))

    def on_listitem_bind1(self, factory, item):
        info = item.get_item()
        label = item.get_child()
        label.props.label = info.get_name()

    def on_listitem_bind2(self, factory, item):
        info = item.get_item()
        label = item.get_child()
        label.props.label = info.get_content_type()

    def on_listitem_bind3(self, factory, item):
        info = item.get_item()
        label = item.get_child()
        label.props.label = f'{info.get_size()} byte'

    def on_columnview_activate(self, listview, pos):
        print(1)

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

directorylist

イケるじゃん。
と思ったけどコレってソートはどうするんだ?
あと隠しファイル等を弾くには bind ハンドラ全部に同じ処理がいるよね。
たしかに簡単だけど実用にはチト使い辛い感じ。